第一篇说了一下实战应该怎么去写代码,这一章就稍微说一下理论方面的东西。redis是no-sql数据库,是内存数据库。
一:redis中存储的数据类型:
1.String 可以理解为map key和value都是字符串类型
这也是我们最常用的类型 如何就存储我就不介绍了,说一些特殊的,当我们设置String类型的key以nx的形式设置时(上一篇就最原始的方法写的时候就有注释)一般的key,在第一次设置key并且赋值后,如果在设置相同的key会将之前的key覆盖,但是使用nx方法设置的key,第二次设置同样值得key并不会被覆盖。所以才说可以作为分布式的锁。
2.hash
hash 也可以理解为map 只不过map的类型是String-map value值也是map类型的对象,hash可以帮我们存放对象类型
命令行的设置:hmset user:1000 username henushang birthyear 1991 user就是对象 username birthyear就是user的属性
2.set
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。 set是集合类型也就是说可以使用一个key来对应多个value。key为runoobkey value为mysql 第二个添加的时候就失败了,set还有一个特别的地方就是,可以将两个set集合中的同样的元素取出来,也可以将不同的元素提取出来 比较的时候会显示前一个集合参数的中的不同数据
redis 127.0.0.1:6379> SADD runoobkey mysql (integer) 1 redis 127.0.0.1:6379> SADD runoobkey mysql (integer) 0
4.list
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。list比较简单,就相当于java中的堆栈,前面后面都可以插入数据,允许重复。可以通过API将一个list集合中的相同元素一次都可以取出
5.SortedSet
set集合,不允许重复,有序,在往集合中设置数据的时候可以设置数据的下标。SortedSet可以帮我们实现排行榜功能,将物品的名字为值,将卖出的件数为下标,每次卖出一件就将对应物品的下标加1,由于显示的时候是由小到大,这个时候反序一下就可以实现我们排行榜的功能了。
二:redis 的发布订阅
redis更多的时候是作为缓存在使用,但是有时候也需要使用它的发布订阅,发布订阅模式就相当于你家定了报纸,送报员每天都会向订阅了报纸的人送报纸,这也就相当于发布订阅模式。
订阅者:subscribe XXX信道的名字
发布者:publish XXX信道的名字 YYY发送的消息
这样就完成了一个发布订阅。
三:reids 的事务
其实这一块没什么好讲的,redis的事务很鸡肋,为什么这么说呢,因为redis的事务没有回滚,一个事务没有回滚的功能还有什么用。
四:redis的持久化
1.持久化策略
第一种:快照
优点:数据保存全面
缺点:在redis的配置文件中搜索save就会看见redis中默认的快照配置 快照是将redis中所有的数据都会更新到磁盘,当使用快照的时候每次都会写大量的数据到磁盘中,太慢,消耗redis的性能
不推荐使用
第二种:aof
1:一个key改变就保存一次 不要用 会大量读写磁盘和数据库差不多
2:自己配置,多少秒将redis中改变的数据持久化到磁盘(一般为1秒),每次只会将修改的数据保存到磁盘,比快照少了很多的数据 推荐使用
3:让操作系统决定如何持久化
五:redis key的淘汰算法 将最长时间没用的key删除
redis是内存数据库,内存有限(可以设定给定内存大小),所以会淘汰key,来保持可用。一般我们在设置key的时候会设置过期时间,所以一般不会将redis的内存耗完。
如果都设置的为不过期key,但是这些key是可以删除的,那么在redis的配置文件中加上 volatile-lru 将会根据key的设置时间将最长时间没有用到的key删除(不管是否是不过期的key),如果不设置,那么不过期的key不会自动删除
六:redis的集群
在之前没用集群的时候,如何做到高可用 主从配置加哨兵(监听主节点的心跳),但是每一个的redis数据量都太大了。
集群一般为6台redis(3主3从),通过路由算法,将key发送到不同的节点,然后在将集群中的每一个redis做主备和哨兵,这样就可以将原来很大的数据量平均下来,每一个redis的数据量就会变小.
分片算法:
最简单的hash算法,通过hash值%存活的机器数量,将不同的key发送到不同节点,但是这样会有一个问题,当一台机器挂了之后,存活的机器数量将会减少,此时key在通过算法去寻找的值得时候,将会发生所有的key都找不到自己的value了,显然这种算法是不可用的。
新的算法:一致性hash 所有的节点围绕了一个环形(圆)。同样通过算法将key发送到不同节点,当其中一个节点不可用时,此时每一个key依旧映射到自己原来的节点上,但是不可用节点上面的key会发送到顺时针计算离自己最近的节点上,这样就算其中的一个节点不可用也不会影响别的节点。一致性hash还有另一个好处,节点的平衡性,每一个节点上面的key 的数量是平均的。回到刚刚所说的,死亡节点上面的key会发送到离此节点顺时针最近的节点上面,那么此时节点上面的key 的数量明显是不平均的。和刚刚的说法明显冲突,此时一致性hash算法的另一个好处就体现出来了,他会在圆环上面创建几个虚拟的逻辑节点来平摊节点中key 的数量,达到一个平均的效果。
redis中是通过Redis Cluster来分区
同样是为了达到当一个节点不可用的时候不会影响其他的节点,将key值映射到槽(slot)中,每一个节点都会负责一部分的槽,当key来时,通过算法找到key所对应的槽。在集群中,只有Master才拥有槽的所有权,salve只有使用权。
七:reids的线程模型
redis是单线程单进程的
套接字就是客户端和访问端的连接,通过IO多路复用,当多个套接字同时请求的时候,会有一个队列,先来先出,因为redis是在内存中的所以处理请求是非常快的。IO多路复用将请求发送给事件分派器,这样对于IO多路复用而已在发送给事件分派器的时候就已经完成一个请求了,事件分派器在去发送到请求所对应的处理器就可以了。
努力吧,皮卡丘