redis命令中心(中文)
redis官网
1、基于内存的数据存储系统
2、基本数据类型:字符串、列表、集合、有序集合、哈希
3、五高级输数据类型:消息队列、地理空间、HyperLogLog、位图、位域
4、单例类无论调用多少次调用对象的方法,得到的结果还是内存中唯一的对象
使用super()new(cls)
5、redis中的中文都是使用二进制字符存储的,想要正常显示中文字符,则启动时加–raw,即redis-cli --raw
6、TTL key,返回值-1为没有设置过期时间,-2表示已经过期了
7、expire,设置过期时间
8、SETEX key time value:设置带有过期时间的键值对
9、SETNX key value:如果键已经存在,则此命令不做任何动作,如果不存在则设置
10、MSETNX key1 value1 key2 value2:具有原子性,要么都成功,要么都失败
11、keys *:获取所有的的key
12、redis不支持回滚,redis事务不满足原子性
13、redis事务执行失败时,会继续执行余下的命令
14、redis事务的命令出错时,则所有的命令不会被执行。
列表list
1、LPUSH list value:list左添加元素value
2、LRANGE list 0 -1:查询list所有元素
3、RPUSH list value:list右添加元素value
4、LINDEX list index:获取指定下标index的值
5、LPOP list:从队列的左边出队一个元素
6、LREM list number value:根据value移除指定的值,并移除number个,如果list中value的数量小于number个,则全部删除并返回删除的数量
7、LTRIME list start end:截取list[start:end]
8、 RPOPLPUSH oldlist newlist:移除列表oldlist中最后一个元素到newlist中
9、LSET list index value:更新list中下标为index的值为value
10、LINSERT list [before|after] 元素1 value:在list的元素1之前或者之后插入value
集合set
1、SADD set value,设置集合set
2、SMEMBERS set,查看集合中的元素
3、SISMEMBER set values:查看value是否在集合set中
4、SREM set value:删除集合中的元素value
5、SRANDMEMBER set member:随机显示member个set中的元素,不写member则默认1
6、SPOP member:随机删除member个元素,不写member就随机删除
7、SMOVE oldset newset value:指定oldset中元素value移动到newset中,如果newset已存在,则向后添加,不存在则创建添加
8、SDIFF set1 set2:set1和set2之间的差集
9、SINTER set1 set2:sert1和set2之间的交集
10、SUNION set1 set2:set1和set2的并集
有序集合sorted set(由分数和成员组成)
1、ZADD zset score mumber:添加集合元素
2、ZRANGE zset start end:查看集合[start: end]中的元素,只输出成员,不输出分数
3、ZRANGE zset start end WITHSCORES:输出带分数的集合
4、ZSCORE zset mumber:查看成员mumber的分数
5、ZRANK zset mumber:查看成员mumber的排序注意:有序集合中的排序是从小到大来排序的,返回的是排序的index
6、ZREVRANK zset mumber:返回从大到小排序的index
哈希HASH
1、HSET hashname key value:创建哈希中的键值对
2、HFET hashname key:获取哈希中某个键的value
3、HDEL hashname key:删除hash中的某个键值对
4、HGETALL hashname :获取该hashname所有的键值对
5、HEXISTS hashname key:判断该hash中是否存在某个键,(1:存在,0:不存在)
6、HKEYS hashname:获取所有键
7、HLEN hashname:索取所有键值对的数量
发布订阅模式
1、SUBCRIBE channel:订阅频道,订阅频道的终端可以有多个
2、PUBLISH channel:向频道发布消息
消息队列Stream(解决了订阅模式的弊端,可以持久化存储)
1、XADD stream * key value:*表示自动生成递增消息id,如XADD stream1 * course python
1.1、XADD stream number key value:自定义id为number的消息,如XADD stream1 123-1 course python
注意:id的格式需要:“整数-整数”,第一个整数代表时间戳,第二个整数代表序列号
2、XLEN stream:看到消息的数量
3、XRANGE stream - +:- +代表显示所有的消息
4、XDEL stream id:删除该id的消息
5、XTRIM srteam MXALEN 0:代表删除所有的消息,返回值为删除消息的数量,即所有消息的数量
6、XRANGE COUNT number BLOCK milesecond STREAM stream 0
其中:COUNT number:代表一次读取number条消息
BLOCK milesecond:代表如果没有消息,堵塞milesecond毫秒
STREAM stream 0:代表读取stream流,0代表index,从头读取,1就是从第二条数据读取,$代表读取最新的
7、XGROUP CREATE stream group id:创建消费者组
8、XINFO GROUPS stream:返回组的相关信息
9、XGROUP CRETAECONSUMER stream group consumer1:为group添加一个消费者
10、XREADGROUP GROUP group consumer COUNT 2 BLOCK 1000 STREAMS stream
地理空间Geospatial(存储地理位置信息的存储结构,并且可以对地理位置计算操作)
1、GEOADD geo 经度 维度 cityname:可以向geo添加一个地理位置信息
2、 GEOADD geo 经度 维度 cityname 经度 维度 name 经度 维度 name :添加多个地理位置信息
3、GEOPOS geo cityname:获取cityname的经纬度
4、GEODIST geo cityname1 cityname2 [M|KM|FT|MI]::返回两个城市间的直线距离,默认单位是米
5、GEOSEARCK geo FROMMEMBER cityname BYRADIUS 300 KM:围绕cityname圆形300KM内的城市
6、GEORADIUS city 120 38 1000 km:查看指定经纬度的1000KM范围内有哪些城市
7、GEORADIUS city 120 38 1000 km withcoord withdist withhash count 2
withcoord:返回城市的name
withdist指定返回城市的’经纬度‘值
withhash指定返回城市的’经纬度‘的hash值,两个城市的hash值越’像‘,证明城市距离越近
count 2:指定返回城市的数量
8、GEORADIUSMEMBER city cityname 100 KM:查看cityname100KM范围内有哪些城市
9、ZREM city cityname:删除name为cityname的城市
HyperLogLog(用来做 基数统计的算法)
基数:一个集合中不重复元素的个数
1、PFADD key name1 name2 。。。:向key中添加元素
2、PFCOUNT key:查看key值的基数
3、PFMERGE newkey key1 key2:合并两个key,并将结果放到newkey中
位图(BitMap)
1、SETBIT key 0 1:设置某个偏移量的值,将key偏移量0的位置设置为1,最后两位就是:下标XX位置上设置为XX(后面的XX只能为0,1)
2、GITBIT key index:索取key偏移量为index的值
3、SET key 0101011:后面的0101011按照顺序存储进去
4、BITCOUNT key:统计key中有几个1
5、BITPOS key 0 start end:key中[start :end]第一个出现0的位置
BITPOS key 1 start end:key中[start :end]第一个出现1的位置
事务
1、multi:开启事务
2、exec:执行事务
2.1:编译时异常,代码有问题,或者命令有问题,所有的命令都不会被执行
2.2:运行时异常,非语法问题,其他的正确命令可以正常执行,所以redis的事务并不保证原子性
3、discard:放弃事务
4、watch key:监控key
主从复制
概念:将一台redis服务器的数据,复制到另一台redis服务器上,前者叫主节点(master),后者叫从节点(slave或者follower)
主从复制中数据的复制是单项的,只能是master到follower,每当一个从节点启动,就会触发一次全量复制;从节点会先写到磁盘中,再从本地磁盘写入到内存
主从复制实现了数据的热备份。(热备份概念:在系统正常运行的情况下备份)
master以写为主,slave以读为主,读写分离,负载均衡,master最好不要做任何持久化存储,特别是RDB,可以让slave做AOF
1、slaveof ip port:一次性设置,以ip port的主机位主节点,如果该从机关闭,则启动时需要重新配置,主机断开时,从机可以正常读原有的数据
2、修改配置文件:replicaof ip port、masterauth password:非一次性配置
3、SLAVEOF no one:让自己变为主节点
哨兵模式
概念:能够监控后台主节点是否故障,如果故障了根据哨兵的投票数量决定哪个从节点转为主节点。如果之后主节点修复了,就只能归并到新的主节点下,作为从节点。
哨兵是个独立的进程,可以独立运行
哨兵模式基于主从复制,相当于自动化版的主从复制
1、添加哨兵的配置文件:sentinel.conf
内容: sentinel monitor 被监控的名称 host port 1 (代表自动投1票选举host port为主节点)
2、redis-sentinel sentinel.conf:启动redis哨兵
RDB、AOF(redis两种持久化存储方式)
持久化:就是将内存的诗句写入到磁盘中,防止电脑异常内存数据丢失
RDB:Redis DataBase,redis服务器默认的持久化存储方式。一般是在一段时间间隔内对数据进行快照存储,通过配置文件中的save命令设置快照周期,生成文件dump.rdb
AOF:Append Only File,另一种持久化存储方式。记录每次对服务器的写操作,每次服务器重启时会重新运行这些命令以恢复原始数据,存储到文件.aof中
1、RDB适合大规模的数据存储,对数据的完整性要求不高,一般在从节点设置RDB持久化存储
2、AOF每次修改都会同步,文件的完整性较好,但性能、效率较慢。
3、两种方式都开启时,redis会优先选择AOF恢复数据
仅适用RDB时,当服务器宕机时可能会丢失部分数据
仅适用AOF时,每次写操作都会被记录,可能存在某个数据的重复操作,这就可能导致无效的重复数据
过期键的删除策略
1、定期删除:每个设置过期时间的key都创建一个定时器,到过期时间立即删除。此策略对内存友好,对CPU不友好,会消耗CPU去处理过期数据,占用一定的时间和吞吐量
2、惰性删除:每到对key发出请求时,才回去检查该key是否已过期,过期则删除。此策略CPU友好,对内存不友好,当大量访问已经过期删除的key再次被访问时,就不会被清除,占用大量内存
3、定时删除:每隔一定的时间时期,扫描expire命令中设置过期时间的key,过期则删除,此方法是两种方法的折中
redis一般使用惰性删除和定时删除结合
redis集群之间如何复制?-------异步复制
一般为什么要做redis分区
分区可以使redis服务器管理更大的内存。可以通过简单的增加计算机的数量来更加服务器的计算能力,服务器的网络带宽也会随着计算机和网卡的增加而增加。
redis有哪些分区方案?
分区的粒度是key,由于集合的key可能不在一个分区,所以在一些集合操作时,有些不方便,比如交集等
-
客户端分区,在客户端就已经决定了写入哪个节点,读取哪个节点
-
代理分区,客户端将读写请求发送给代理,由代理决定请求发送给哪个节点,然后根据rediss节点返回的信息返回给客户端
-
查询路由,客户端发送请求,由redis服务器决定请求给哪个节点。
缓存雪崩
概念:缓存同一时间大面积失效,导致后面的请求都直接访问数据库,造成数据库压力大而崩掉
解决:1)避免key同一时间大面积失效,可以将key的过期时间随机
2)加锁排队
3)给每个key增加缓存标记,用来记录key是否失效,失效则即使更新缓存
缓存穿透
概念:请求缓存和数据库中都没有的数据,缓存中找不到的数据,会直接访问数据库,造成数据库压力大而崩掉
缓存击穿
概念:并发查同一条数据,缓存中没有但数据库中有,即同一时间并发用户多,又访问同一数据,而导致数据库压力大而崩溃
解决:1)可以设置热点数据永不过期,persist
2)访问加互斥锁
Redis回收使用的什么算法----LRU算法
LRU算法:Least Recently Used最近最少使用算法,是一种页面置换算法。该算法给每个页面设置一个访问字段t,用来记录最近一个访问的时间,当需要淘汰一个页面的时,就淘汰字段值t最大的。
Redis的数据淘汰机制(当内存大小达到一定量时)
全局key:
1、no-evication:新数据增加时报错,不淘汰内存中已有的数据
2、allkeys-lru:从数据集中淘汰最近最少用的数据
3、allkeys-random:从数据集随机淘汰
设置过期时间的key:
1、volatile-lru:从设置了过期时间的key中淘汰最近最少使用的数据
2、volatile-random:从设置了过期时间的key中最忌淘汰
3、volatile-ttl:从设置了过期时间的key中淘汰,过期时间较早的key