您的位置:首页 > 其它

缓存 使用注意事项 淘汰策略

2016-10-19 11:19 344 查看
Could not get a resource from the pool
3	redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
解决办法: 可能是连接数不够用了,在高并发的情况下,测试会不会出现这个问题。
如果会出现,那就只能 增加连接数了。

缓存使用的注意点:
错误场景:
获取订单信息的时候:set 一个缓存。
取消订单的 时候,  服务是一个事务(在内部 我先 更新的订单的状态,然后删除了订单的缓存)
问题 出现的点:
在调用 取消订单的时候,他是一个事务,事务还没完成,但是缓存已经删除的时候,另外一个线程调用获取订单信息,
获取到的是 一个锁定状态的订单,因为刚才的线程事务没结束,所以 取消状态没有入库。
这样问题       就出现了,缓存里是一个  锁定 状态,库里 却是 取消状态,而且,因为 这个订单不会再有其他操作,所以一直会是错的。

如何 解决问题?
1 在最后取消订单的时候,不去删除缓存,而是 更新缓存为 取消状态,这样应该就可以解决问题。
2 在最开始的时候,用add 方法添加缓存,其他改变订单状态的地方都用 set ,这样就不会有问题了。

另外一个问题?
缓存不做删除,而是做更新,如果事务失败了,怎么办?
那缓存的数据和 库里的数据 也是不一致。
思路错误:
更新缓存的操作放在最后一句,如果事务失败,就不会 操作缓存。所以不会出现缓存数据和库里数据不一直现象。

关于redis内关于redis内存淘汰策略

存淘汰策略

当redis使用的内存数大于可使用的内存数时,进行内存淘汰。
相对于Memcached来说(只有LRU淘汰算法),redis的淘汰算法比较丰富,主要有3种:
1.随机淘汰算法:从数据库中随机删除一个key
2.LRU淘汰算法:从数据库中删除一个最近最少访问的key
3.TTL淘汰算法:从数据库中删除一个最快过期的key
通过maxmemory-policy配置项指定使用的淘汰算法,至于使用哪种淘汰算法,应根据自己的需求设定。
redis 确定驱逐某个键值对后,会删除这个数据并,并将这个数据变更消息发布到本地(AOF 持久化)和从机(主从连接)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: