redis 分布式
4.1 redis 锁(如分布式事务锁实现)
分布式事务主要解决的就是同一时间只有一个线程在修改共享资源。所以redis的setnx 加上时间设置完全可以实现分布式事务的问题。(注意控制锁的颗粒度:如 共享资源 绑定的是uid 还是requestId )
代码实现:
# 主要逻辑根据实际业务需求public class RedisLock { private final static Logger LOGGER = LoggerFactory.getLogger(RedisLock.class); private CacheService cacheService; /** * 加锁 * * @param key * @param value 当前时间+超时时间 * @return */ public boolean lock(String key, String value) { if (cacheService.opsForValue().setIfAbsent(key, value)) { return true; } String currentValue = cacheService.opsForValue().get(key); //如果锁过期 解决死锁 if (StringUtils.isNotBlank(currentValue) && Long.parseLong(currentValue)
注意:
1、操作完成后需要将锁释放。
2、出现异常要及时将锁释放。(如果颗粒度比较大,不释放锁别人都得不到操作权限)。
3、注意颗粒度的选择,绑定的是uid还是requestId。权限过大会影响别的线程操作使用。权限过小容易损耗性能。
4.2 redis的队列(生产/消费模式)
redis queue
实际场景 :
发红包 ---->将红包散列成小红包---->放入队列 。
抢红包时 ---->检查用户权限---->检查红包库存---> 从队列中弹出小红包。
(Redis的单线程操作,完全可以控制红包的小并发问题)。如果要更大并发可以直接将请求放入
MQ 进行异步处理。
4.3 redis session服务器(存储用户信息)
常见的session服务器,实现分布式的基础,实现session共享,实现跨服务,减轻服务端的压力。
redis session
4.4 redis 做数据排行榜(热数据分离)
常见需求TOP10/TOP100排行榜。实现原理可以使用Redis中的有序集合SortSet 完美的实现动态排行榜。(或者可以把热数据直接放入Redis,如:实时美元的汇率,波动不定的价格等)。
4.5、保持变动频率较高的数据,如:计数器(网站访问量),点赞/收藏 等。
4.6、redis的订阅发布模式SUB/PUB。如:网站站内信/实时公告。当然也会有更好的别的中间件替代,这里只是举例子。
订阅--->订阅成功--->监听 。 发布消息message1 。此时订阅该channel的client端都可以接收到消息。
每日一图
本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.sosokankan.com/article/2300565.html