目前项目的热数据一直使用.net本身的cache类,但是随着业务增加,现在对ecs进行了负载均衡。
负载均衡后cache的弊端开始暴露,因为cache本身依赖应用池,多个节点间维护各自的应用池,负载均衡后各个节点可能造成热数据不统一,并且应用池回收后cache自动被回收的问题。所以开始使用成Redis。
1.官方下载Redis
https://github.com/MSOpenTech/redis/releases
Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择。
下载安装后,目录结构如下:
其中,
redis.windows.conf:配置文件
redis-server.exe:服务端
redis-cli.exe:客户端。
1.首先修改redis.windows.conf
- 定位到bind
- 这里绑定的是你的Redis安装的本机的访问IP。建议还是用局域网,端口默认Port是6379,也可以在此修改
- 设置最大内存使用
单位是byte
- 设置最大head
- 设置日志目录
- 然后点击redis-server.exe运行
这样就配置完成了。但是这样每次服务器重启后,需要手动运行redis-server.exe,所以我们把redis-server.exe设置到window服务里面,
redis-server --service-install redis.windows-service.conf --loglevel verbose
输入命令之后没有报错,表示成功了,刷新服务,会看到多了一个redis服务。
设置自动启动即可,但是会发现怎么也无法启动,报错:
错误 1067 进程意外终止
研究后发现是logs目录未创建的缘故,我们只要在Redis目录下创建日志目录logs。即可。
2.在项目中引用ServiceStack.Redis
这个也是官方推荐.net使用的Redis库
这个版本需要依赖于其他3个库。
RedisClien是主要操作的类,目前只用到Get<T>,Set<T>。其他的小伙伴可以自行查看。
3.完成开发上线报错
本地测试无问题,但是上线后会报些奇怪的错误。
Unexpected reply 错误
几次报的都不太一样,但是都和RedisClient.Get相关。
然后详细看了下ServiceStack.Redis的文档,然后发现ServiceStack.Redis不支持我们传统认为的线程安全。
每一个线程可以从连接池里获取一个连接供本线程使用,在使用完毕过后必须还回给连接池
查看了下RedisClient发现继承了IDisposable接口,于是using之后,错误消失。
The free-quota limit on '6000 Redis requests per hour' has been reached.
随后又出现了6000 Redis requests per hour的错误,发现原来ServiceStack.Redis V4以后版本开始商业化,每小时只能请求6000次,所以改成v3.9版本