ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # redis * * * * * Redis从 2. 8版本正式提供了高可用实现Redis Sentinel,它能够保证Redis节点的故障发现和故障自动转移。Redis从3. 0版本正式提供了分布式实现Redis Cluster,它是Redis真正的分布式实现,提供了高可用、读写和容量的扩展性。 ## 1. 数据类型 * redis支持的数据类型主要有string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)五种。 * redis所有的键都是字符串类型, 而且其他几种数据结构都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的基础。 ### 1.1 string字符串类型 * * * * * * 字符串是redis数据结构的基础,除了可以存储简单的字符串之外,还可以存储JSON、XML、二进制(图片、音频、视频...)等。 * * * * * #### 1.1.1字符串常用的操作命令 说明:k 代表键,v 代表值 | 命令 | 说明 | | --- | --- | | set k v |设置键值对 | | setex k seconds v |设置键值对,并添加过期时间 | | setnx k seconds v |当键不存在时,设置键值对 | | setnx k seconds v | 当键存在时,设置键值对 | | get k |获取对应键的值,不存在返回nil | |getrange k start end| 获取对应值指定位置字符串从零开始| | mset k v (kv)... |批量设置多个键值对 | | mset k (k)... |批量设置多个键值对 | | incr k |对键对应得值进行自增操作 | | incrby k 数值 | 对键对应得值增加指定的数量 | |decrby k 数值 |对键对应得值增加指定的数量 | |append k v| 对值进行追加| * 批量操作命令可以在开发中提高执行效率。 * * * * * ### 1.2 hash(哈希) * redis的是一种键值对的套用,一个键的值包含了多个键值对。 * hash适合存储具有多个信息的记录,通过序列化可以提高内存使用效率。 * * * * * #### 1.2.1常用命令 * 说明:f代表hash,k代表hash中的键,v代表键的值 | 命令 |说明 | | --- | --- | | hset f k v |设置hash的键值对 | | hget f k |获取hash对应键的值 | | hset f k v ...| 批量设置hash的多个键值对 | | hmget f k... |批量获取hash中多个键的值 | | hkeys f | 获取所有值 | | hexists f k |判断是否存在k | | hgetall f|获取所有的键值对 | | hincrby f k |自增 | * * * * * ### 1.3 List(列表) * List用来存储多个有序的字符串,在实际的开发中可以作为栈和队列使用。 * List中的element是有序的,并且可以重复。 * * * * * #### 1.3.1 List命令 * 说明:L代表List,v代表List中的值,nv代表新值。 | 命令 | 说明 | | --- | --- | |lrange 0 -1 |从左到右获取列表的值 | | rpush L v... | 从List的右侧插入值 | | lpush L v... | 从List的左侧插入值 | | lrange k start end |获取指定范围内的列表 | | lrem L count v |找到对应得值,并根据count的正负向左或者向右删除count个值 | | ltrim L start end |截取指定范围的List | | lset L index nv |截取指定范围的List | | lpop l v|从左弹出值 | | lpop l v|从右弹出值 | * List的阻塞操作 | 命令 |说明 | | --- | --- | | blpop k time|根据time阻塞等待从左查询List数据,time=0阻塞等待,否则为固定时间 | | brpop k time|根据time阻塞等待从右查询List数据,time=0阻塞等待,否则为固定时间 | * * * * * #### 1.3.2 List适用场景 * 栈 lpush + lpop 先进后出模型(左插左弹) * 队列 lpush + rpop 先进先出模型(左插右弹) * 阻塞队列 lpush + brpop 消息队列(阻塞获取值) * * * * * ### 1.4 set(集合) * 无序 * 不可重复 * 不能通过下表获取元素 * redis支持集合的交集、并集、差集操作 * * * * * #### 1.4.1集合相关命令 * 说明s代表集合,e代表元素 | 命令 | 说明 | | --- | --- | | sadd s e... |向集合中插入一个或者多个值 | | srem s e... |向集合中删除一个或者多个值 | | spop s |集合中随机弹出一个值 | | sismember s e |判断元素是否存在集合中 | | smembers s |获取集合所有元素 | | scard s|时间复杂度O(1)计算集合元素个数 | | sadd s e... |向集合中插入一个或者多个值,存在返回1,不存在返回0 | | srandmem s count |从集合中随机弹出 | | sinter s1 s2 |求两个集合的交集 | | sunion s1 s2 |求两个集合的并集 | | sdiff s1 s2.... |求s1与两个或者多个集合的差并集 | | sunion或sinter或sdiff+strore ...|集合操作的结果保存起来 | * * * * * #### 1.4.2 set编码方式 * intset(整数集合):当集合中的元素都是整数且元素个数小于set-max-intset-entries配置(默认512个)时,Redis会选用intset来作为集合的内部实现,从而减少内存的使用。 * hashtable(哈希表):当集合类型无法满足intset的条件时(元素个数大于512),Redis会使用hashtable作为集合的内部实现。 * object encodeing key :查看元素编码类型 * * * * * #### 1.4.3 set使用场景 * 标签 对事物进行特性的描述,例如可以在电影推荐领域,对某一用户进行标签,体现用户可能喜欢那种类型的电影,喜欢的影星,导演,有了这些标签可以对用户进行个性化的推荐。 * spop 随机性事物 * * * * * ### 1.5 zset(有序集合) * 不可重复 * 有序 * 元素依靠对应的分值进行排序 * * * * * #### 1.5.1 有序集合相关命令 * 说明:zk代表有序集合,score代表元素的分值,v代表元素 |命令|说明 | | --- | --- | | zadd zk score v ... | 像有序集合中添加元素 | | zcard zk |查看元素个数 | | zscore zk v |查看元素的分值 | | zrank zk v |查看元素的排名 | | zrem zk v |删除元素 | | zincryby zk n v |给元素增加n分 | | zrange zk start end withscores |从低到高返回指定范围的元素 | | zrevrange zk start end withscores |与zrang正好相反 | |zrangebyscore zk min max withscores|从低到高返回一定分值范围的元素| |zrevrangebyscore zk min max withscores|与zrangebyscore正好相反| |zcount min max|返回范围内的成员个数| |zremrangebyrank start end |删除指定范围排名的元素| |zremrangebyscore min max |删除指定范围分数的元素| * * * * * * 集合在进行集合运算后,可以对分值进行aggregate(聚合),聚合又三种方式:sum(取和)、min(取最小值)、max(取最大值) * 分值操作命令 * 并集 zunionstore <destination> <numkeys> zk1 zk2 <weights> 1 n <aggregate> [sum、min、max] ---destination 指的是将两个集合并集操作后的结果保存 这是一个键 --- numkeys 需要做交集计算键的个数 ---weights zk2的权重,默认是1,这里把zk2的分值乘以n ---aggregate 把合并后的两个元素对应的分值求和(sum默认)、取最小值(min)、取最大值(max) * 交集 zinterstore <destination> <numkeys> zk1 zk2 <weights> 1 n <aggregate> [sum、min、max] ---destination 指的是将两个集合交集操作后的结果保存 这是一个键 --- numkeys 需要做交集计算键的个数 ---weights zk2的权重,默认是1,这里把zk2的分值乘以n ---aggregate 把合并后的两个元素对应的分值求和(sum默认)、取最小值(min)、取最大值(max) * * * * * #### 1.5.2 内部编码 * ziplist(压缩列表) 当有序集合的元素个数小于zset-max-ziplist-entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist可以有效减少内存的使用. * skiplist(跳跃表) 当ziplist条件不满足时,有序集合会使用skiplist作为内部实现,因为此时ziplist的读写率会效下降。 * * * * * #### 1.5.3 适用场景 * 由于zset的元素的有序性,非常适合排行类的业务场景 * * * * * ### 1.6 Bitmaps * Bitmaps是一种可以对位操作的字符串 * Bitmaps 类似于一个以位为单位的数组,数组的下表在Bitmaps中被叫做偏移量,由于是位,所以值只有0或者1 #### 1.6.1 命令 | 命令 |说明 | | --- | --- | | setbit k offset value |设置键的第offset位的值(从0开始))| |getbit k offset|获取键的第offset位置的值 | |bitcount k [start end]|获取键(范围)的值为以1的个数 | |bitops k 1|查看第一个出现1的偏移量 | * bitop op destkey key[ key....] bitop是一个复合操作,它可以做多个Bitmaps的 and(交集)、or(并集)、not(非)、xor( 异或)操作并将结果保存在destkey中。 * * * * * ### 1.6.2 场景 * 适合存在是否的场景 在是(1)存在较多的情况下要比其他数据结构省内存 ### 2. 全局命令 | 命令 | 说明 |时间复杂度 | | --- | --- | --- | | keys * | 扫描所有键 | o(n) | | dbsize | 获取键总数 | o(1) | | del key...|删除key | o(1) | | expire key seconds|设置过期时间 | o(1) | | ttl key|查看过期时间 | o(1) | | type key|查看key对应的value的类型 | o(1) | ### 1.7 HyperLogLog > 相对于集合 比较省内存 > * pfadd :向HyperLogLog插入数据 > * pfcount | 命令 | 说明 | | --- | --- | | pfadd key element... | 向HyperLogLog中插入数据 | | pfadd key element... | 查询HyperLogLog中数据 数量 |