redis使用总结记录
1、单线程,单个命令都是原子性操作
2、5种数据类型,string(字符串),hash(哈希),list(列表),set(集合不可重复)及zset(sorted set:有序集合)
3、multi事务与pipeline管道,都是批量执行命令,区别pipeline不是原子操作,
4、事务没有回滚,WATCH 一个或多个key,在事务执行之前,如果key被改动,那么事务将不执行,原子操作,如果事务执行期间报错,不回滚
5、秒杀简单实现:通过list的pop原子操作,防止多卖,重复购买等功能
库存列表,用户排队列表,已抢列表
起多个线程循环lpop,lpop原子操作,保证多线程安全,
从用户排队列表pop一个用户,如果pop成功,判断库存是否还有,判断用户是否已经抢过,再从库存列表pop一个商品,如果成功则取出来(原子操作)
还可以用redis分布式锁实现
商品库(作为共享资源,可能会有一个集群应用来购买商品,该共享资源的载体可以是数据库或nosql)
利用分布式锁可以更小粒度的对每个商品加锁
大概实现:
1、假设数据库或nosql存储着每个商品的name和num,每个商品作为key
zookeeper分布式锁参考资料
http://blog.csdn.net/youmengdaigu/article/details/44134233
http://blog.csdn.net/sunfeizhi/article/details/51926396
http://blog.csdn.net/abccheng/article/details/72420996
6、排行榜的实现
set类型本身就有,交集、并集、差集的功能,下面是zset的实现
7、Redis集群的不足
redis集群无法保证数据强一致性,主从是异步同步
2)、集群,高可用,可扩展,注意:假设有三个机房,分别是JF-A、JF-B、JF-C,假如JF-A断网的情况(比如光钎被挖断了:just a joke),这种情况需要考虑在JF-B,部署一套所有主节点的slave,因为数据分布在不同的slots 槽位,当一个主节点包括所有的
slave都挂掉的时候,分布在该主节点的slots的key就无法使用,一共有16384个slots
8、Redis集群的优点
实现高可用,可扩展
9、Redis消息队列的不足
1)、持久化机制,会把所有数据持久化
2)、没有可靠发布、消费机制
3)、消费者没有负载均衡
4)、没有队列监控、流量限制等
10、Redis消息队列的优点
轻量级,高并发,延迟敏感 可使用在即时数据分析、秒杀计数器、缓存等场景