1. redis事务
1.1 redis事务是什么?
1.可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行执行而不会被其它命令插入,不许加塞
2.redis是支持事务的,支持部分事务
3.redis2.2版本以后又支持一个CAS操作
1.2 可以怎么做?
1.一个队列中,一次性、顺序性、排他性的执行一系列命令
1.3 怎么去进行使用?
1.3.1 正常执行和放弃事务
1.开启事务:MULTI [会返回一个OK]
2.set k1 v1[这个时候返回的是一个QUEUED,代表是在队列里面,这个时候其实并没有提交]
3.提交事务:EXEC[这个时候会将你开启事务之后和提交之前所有的操作的结果给给出来]
4.放弃事务:DISCARD[这个时候开启事务之后做的步骤都没用了]
5.总结:其实开启事务就相当于你推了个购物车,set的操作就像你将要买的东西放进去,但是还没有付钱,所以还不能算。EXEC就相当于你付钱了,然后给你你买东西的清单
1.3.2 全体连坐
1.也就是开启事务之后不管有多少操作,只要有一个出错了,就全部失效
1.3.3 冤头寨主
1.也就是开启事务之后不管有多少操作,谁错找谁,其他对的请放行
1.3.4 watch监控
- 悲观锁/乐观锁/CAS(check and set)
- 悲观锁
- 顾名思义就是很悲观,每次去拿数据的时候都认为被人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。
- 传统的关系型数据库里面就用到了很多这种锁机制,比如行锁,表锁,读锁,写锁等,都是操作之前先上锁
- b.乐观锁
- 顾名思义就是很乐观,每次去拿数据的时候都认为别人不会去进行修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁使用于多读的应用类型,这样可以提高吞吐量
- 乐观锁策略:提交版本必须大于记录当前版本才能执行更新
- CAS
- 悲观锁
- 初始化信用卡可用余额和欠额
- 无加塞篡改,先监控在开启multi,保证两笔金额变动在同一个事务内
- 有加塞篡改:执行成功会返回正常值,执行失败会返回nil
- unwatch
- 一旦执行了exec之前加的监控锁都会被取消掉了
- 小结
- watch指令。类似乐观锁,事务提交时,如果key得值已被别得客户端改变,比如某个list已被别的客户端push/pop过了,整个事务队列都不会执行
- 通过watch命令在事务执行之前监控了多个keys,倘若在watch之后有任何key的值发生了变化,EXEC命令执行的事务都将被放弃,同时返回Nullmulti-bulk应答以通知调用者事务执行失败
1.4 事务的3个阶段
1.开启:以MULTI开始一个事务
2.入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面
3.执行:由EXEC命令触发事务
1.5 事务的3个特性
1.单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
2.没有隔离级别的概念:队列中的命令没有提交之前都不会被实际的执行,因为事务提交前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头疼的问题
3.不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚
2. redis的订阅
1.虽然说redis是主要被我们用来做了缓存,但实际上,redis其实也自己研究和加入了订阅。只是我们更习惯的去使用消息中间件。这边也不会过多的去介绍,就是简略的提一下:
2.1 redis的事务是什么
1.进程间的一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接受消息
2.订阅/发布消息图
2.2 一个小案例
先订阅后发布后才能收到消息
1.可以一次性订阅多个 subscribe c1 c2 c3
2.消息发布 publish c2 hello-redis
3.订阅多个,通配符*,psubscribe new*
4.收取消息,publish new1 redis2015
3. redis主从复制[master/slave]
3.1 主从复制简介
- 是什么?
行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slave机制,master以写为主,slave以读为主 - 能做什么?
a.读写分离
b.容灾恢复
3.2 应该怎么去进行使用?
- 配从(库)不配主(库)
- 从库配置:slaveof主库IP主库端口
1.每次与master断开之后,都需要重新连接,除非你配置进redis.conf文件
2.Info replication:查看当前数据库得状态,看是主库还是从库 - 修改配置文件细节操作
1.拷贝多个redis.conf文件
2.开启daemonize yes
3.pid文件名字
4.指定端口
5.log文件名字
6.dump.rdb名字
3.2.1 常用3招
- 一主二仆
a.init
b.一台主机两台备机[只有主机才可以写,从机不能写]
c.日志查看
d.主从问题演示 - 薪火相传
a.上一个slave可以是下一个slave得master,slave同样可以接收其他slaves得连接和同步请求,那么该slave作为了链条中下一个得master,可以有效减轻master得写压力
b.中途变更转向:会清除之前得数据,重新建立拷贝最新得
c.slaveof新主库ip新主库端口 - 反客为主
a.slaveof no one:使当前数据库停止与其他数据库的同步,转成主数据库
3.3 哨兵模式(sentinel)
3.3.1 是什么?
1.反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换成主库
3.3.2 哨兵模式的使用步骤
- 自定义的/myredis目录下新建sentinel.conf文件,名字绝对不能错
- 配置哨兵,填写内容
a.sentinel monitor被监控数据库名字(自己起名字) 127.0.0.1 6379 1
b.上面最后一个数字1,表示主机挂掉之后salve投票看让谁接替成为主机,得票数多少后成为主机 - 启动哨兵
- 正常主从演示
- 原有的master挂了
- 投票新选
- 重新主从继续开工,info relication查看
3.4总结
1.一组sentinel能同时监控多个master
2.复制延迟
- a.由于所有的写操作都是先在master上操作,然后同步更新到slave上,所以从master同步到slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,slave机器数量的增加也会使这个问题更加严重
4.使用场景
1.五种数据类型:string list zset set hash
2.String:
常用命令:set,get,decr,incr,mget 等
使用场景:String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。 常规key-value缓存应用; 常规计数:微博数,粉丝数等
举例:我们在nginx做负载均衡的时候,如果是基于权重的分配方式,切换web服务器时,会导致用户的session信息丢失我们可以将它保存在redis中
3.hash:
常用命令:hget,hset,hgetall 等
使用场景:redis中的哈希结构就如同java中的map一样,Hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。 Redis 的 Hash 结构可以使你像在数据库中 Update 一个属性一样只修改某一项属性值。它的使用方法就像它的别名字典,通过对应的字典名(key)和词条名(field)查询内容(value)
举例:比如我们可以Hash数据结构来存储用户信息,商品信息等等。例如修真院的首页的职业信息,只是简单的信息集合,我们可以直接将它储存到redis中,在读取的过程中就不用序列化对象,直接操作
4.list:
常用命令: lpush,rpush,lpop,rpop,lrange等
使用场景:list就是链表,Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如微博的关注列表,粉丝列表,最新消息排行等功能都可以用Redis的list结构来实现。
Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销
5.set:
常用命令:sadd,spop,smembers,sunion 等
使用场景:set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的。 当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的、
举例:
1.共同好友、二度好友
2.利用唯一性,可以统计访问网站的所有独立 IP
3.好友推荐的时候,根据 tag 求交集,大于某个 threshold 就可以推荐
6.zset
常用命令: zadd,zrange,zrem,zcard等
使用场景:和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列。
举例: 在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息,适合使用Redis中的SortedSet结构进行存储。
目前就先只想到了这些,等到时侯在想到或者看到了啥跟redis有关的,我会在进行更新的~