csredis icon indicating copy to clipboard operation
csredis copied to clipboard

关于使用CSRedis.CSRedisClient的疑问

Open NodeGreenHand opened this issue 3 years ago • 10 comments

你好, 这个redis访问帮助类,我有几个疑问,麻烦帮我解答下: 问题1:推荐使用单例模式,好处是什么?我的应用场景是只用来读取redis里面的数据,在使用多线程访问的情况下,使用单例是否会造成阻塞,即每次访问数据都是串行,反而降低访问效率? 问题2:每创建一个redis访问实例对象,是否就表示创建了一个新的socket链接,又是什么时候销毁的? 问题3:socket链接与连接池是什么关系? 谢谢

NodeGreenHand avatar Sep 17 '22 14:09 NodeGreenHand

单例,不是一个实例 socket,内部是一个 SocketPool,每次用的时候取,用完归还。

2881099 avatar Sep 17 '22 14:09 2881099

如果是刚使用,建议用重构的 FreeRedis,已经开源两年。

https://freesql.net/guide/freeredis.html

2881099 avatar Sep 17 '22 14:09 2881099

CSRedisCore 是 .NETFramework 4.0 及以上 访问 redis-server 的客户端组件,也是 FreeSql 作者早年发布的 nuget 版本。

后来重构了更简易的 FreeRedis,目前推荐大家使用 FreeRedis。

开源地址:https://github.com/2881099/FreeRedis

FreeRedis 真正做到了零依赖,引用后只有一个 FreeRedis.dll ,支持 .net40 之后的所有版本,包括即将支持的 AOT 也很容易。

2881099 avatar Sep 17 '22 14:09 2881099

单例,不是一个实例 socket,内部是一个 SocketPool,每次用的时候取,用完归还。 我的疑问在这,我想节约每次打开数据库连接池的时间,即我想复用打开的连接池这个对象,比如,我最多允许打开50个连接池,每次多线程并发访问,有多余连接池的时候,直接获取,不再创建,没有多余的到时候,只要小于50,则创建新的,用完后,新的又保存起来,能满足这种需求吗?谢谢

NodeGreenHand avatar Sep 17 '22 14:09 NodeGreenHand

现在就是你要的机制

2881099 avatar Sep 17 '22 14:09 2881099

建议使用 FreeRedis 他支持更高的 redis 功能,可扩展性更方便

2881099 avatar Sep 17 '22 14:09 2881099

建议使用 FreeRedis 他支持更高的 redis 功能,可扩展性更方便

这个也满足我刚才说的应用场景吗?然后就是单例的好处是什么?如果使用多个实例,在并发访问时,在只读取数据的情况下,是否会更快?谢谢

NodeGreenHand avatar Sep 17 '22 15:09 NodeGreenHand

FreeRedis 也是一样的,单例可以内部消化连接池,还有一些参数设置只需要设置一次,比自己 new 使用更方便。

2881099 avatar Sep 17 '22 15:09 2881099

FreeRedis 也是一样的,单例可以内部消化连接池,还有一些参数设置只需要设置一次,比自己 new 使用更方便。

如果使用单例,是否会造成串行访问数据的情况,比如:A、B两个线程,获取数据时,同时使用这个单例对象,会导致其中一个线程等待另一个线程获取完后才能再获取吗?FreeRedis单例是自己实现还是内部已经实现了?谢谢。

NodeGreenHand avatar Sep 17 '22 15:09 NodeGreenHand

不会串,csrediscore 生产6年了,freeredis 生成2年。都是一个机制,内部连接池跟你上面描述的机制一样,会不会排队,取决于连接池使用情况,并发高就会排队。

2881099 avatar Sep 17 '22 15:09 2881099