Redis基础内容-整理学习
Redis基础数据类型
Redis支持多种数据类型
String:
转载自
使用String时就是简单的key-value模型,当然value也支持数字类型的数据
- SET key value [EX seconds][PX milliseconds] [NX|XX] :绑定key和value值(覆盖并忽略原始类型),EX seconds为过时时间,PX milliseconds为过期时间(NX:只有key不存在的时候才会设置key的值,XX:只有key存在的时候才会设置key的值)
- SETRANGE key offset value:命令覆盖字符串offset为开始的位置,之后用value覆盖该位置之后的所有数据,即substr+concat类似,若offset>length,会自动补充0位(\x00是16进制的0)进入位置,直到offset到达之后开始插入数据,若value的长度大于原字符串可覆盖的长度,会重新申请内存,这时候由于要分配内存,可能出现阻塞。
- MSET key value [key value …]:一次设置多个key-value,若key的值存在,会直接覆盖。该操作是原子的。
- MSETNX key value [key value…]:关于NX可参照普通的SET命令,NX标识如果有key存在,则操作都不会执行,即要么全改要么全不改。
- SETEX key seconds value:和SET key value ex seconds 相同
- PSETEX key seconds value:和SET key value px seconds 相同
- SETNX key value:和SET key value nx相同
- GET key:根据给定的key获取对应的value值,但value的类型必须为String
- MGET key [key …]:根据给定的key集获得对应的value集,如果有key对应的数据为空对应的位置也为nil,为了应对在高并发情况下数据修改速度过快导致两次应该是同一时刻的数据产生误差(该操作仅仅是同一时刻交于redis去实现,一次性传输)
- GETRANGE key start end:切割字符串,相当于2.0的SUBSTR,可用复数定义尾部未知的下标位置,-1是倒数第一个,-2是倒数定,若start和end超出范围,只会返回范围内的结果
- GETSET key value:设置key的值,并返回之前的值,值必须为String不然会报错
- STRLEN key:返回key对应String的长度,值必须为String不然会报错
- APPEND key value:如果key存在且value为String,则String尾部追加value,如果不存在创建这空字符串的key,再追加
- INCR key:对key的整数值进行原子的+1操作,不存在的话创建一个key默认0再进行+1,存在且value不是String或无法转换为整数会报错(这种数据其实底层保存的就是一个整数,没有数据浪费),操作仅限于64位的有符号整数
- DECR key:原子-1,雷同INCR
- INCRBY key increment:原子的加increment
- DECRBY key increment:原子的减increment
- INCRBYFLOAT key increment:float的原子加操作,没有原子减操作,可以直接加复数
- SETBIT key offset value
List:
Redis的List为双向链表模型,使用List结构能够简单得到某组数据的排名等数据,Redis内部的List是怎么样的呢。
typedef struct listNode {
// 前置节点
struct listNode *prev;
// 后置节点
struct listNode *next;
// 节点的值
void *value;
} listNode;
以上是Redis对节点的定义。
typedef struct list {
// 头节点
listNode *head;
// 尾节点
listNode *tail;
// 链表中的节点数
unsigned int len;
// 节点值复制函数
void *(*dup) (void *ptr);
// 节点值释放函数
void (*free) (void *ptr);
// 节点值对比函数
int (*match) (void *ptr, void *key);
} list;
以上代码段是Redis中的列表的封装。list结构记录了链表的头指针,尾指针,链表的节点数。dup,free和match三个成员则表示对节点的值进行复制,释放和比较的函数。由于这里的节点的value的内容是任意的,复制和释放并不一定能用类似于memcpy和free的函数来处理
Redis列表的特性
- 双端:每个节点都有prev,next节点,因此根据某个节点获取其上下节点的时间复杂度都是O(1)
- 无环:首节点的prev和尾节点的next都是null
- 带表头指针和表尾指针:通过list的head和tail两个指针,可以随意的从链表的头和尾进行操作
- 带链表长度计数器:可以直接通过len属性获取链表长度,时间复杂度是O(1)
- 多态:链表使用void*指针来保存Value,并且通过dup,free,match方法来操作节点的value值,因此链表可以保存任意类型的值
指令
- RPUSH key value [value …]:将指定值传入key的列表的尾部,key不存在的话,在PUSH执行会自动创建一个空列表,如果key对应数据已有值且不是一个list,则会返回一个错误。同时push多个从左至右依次向尾部插入数据。(可以将用户并行的请求放入队列中,后台依次从队列中获取任务,处理后将结果返回到结果队列,并行转串行,当然也可以多核并行处理队列中的请求)
- LPUSH key value [value …]:与RPUSH的功能一致,不过LPUSH是从列表左边开始入值
- RPUSHX key value:与上雷同,但是仅在队列存在时有效,没有队列存在时不会自动创建,返回0标识插入数据失败
- LPUSHX key value:反向
- LPOP key:从队列左边出队一个元素,复杂度O(1),list为空的话返回nil
- RPOP key:从队列右边出队一个元素。
- BLPOP key [key …] timeout:删除并获取列表集的第一个列表的第一个元素,如果为nil,则取下一个列表的第一个元素,以此类推。如果列表集都没有元素则阻塞,直到timeout(秒)到期或者有一个可用,不然返回nil(BRPOP相反)
- RPOPLPUSH source destination:删除列表中右边第一个元素添加到目标列表的左边,官方给定的两个案例说明其用处:1.被用于安全队列中,处理得到消息的消费者突然崩溃,消息丢失的情况,是怎么解决的呢?消费者端在得到消息的时候会把消息放入到一个正在处理的列表。当消息被处理了之后,该命令会使用LREM命令移除对应的消息。甚至可以添加一个客户端来监控这个正在处理的列表,若是消息长时间存在了(即表示处理该消息的客户端崩溃了)则将这些超时信息重新添加入队列中。2.被用于循环列表中:LRANGE需要将整个列表都从服务器端传送到客户端,但如果source=destination,客户端在访问一个具有n个元素的列表时,可以在O(n)的时间里一个接一个获取元素,这样就能够很容易的实现这样一个系统:(1)有N个客户端对同一个列表进行旋转(rotating),他们会取的不同的元素,知道列表里所有元素都被访问过,又从头开始这个操作{ 解释:N个客户端轮询访问的时候不会改变队列的顺序,只会改变队列的首尾,在此轮训状态下,该队列几乎可视为循环队列,在循环列中只要确定要好了当前位置,就能保证无论首尾位置是什么,下一个元素是不会更改的 };(2)有其他元素往列表末端加入新的元素
可用于在服务器上的监控程序,在尽可能端的时间内,并行的检查网站可访问性。
这种模式是易于拓展和安全的,即使客户端的接收的信息丢失了,也会存在在队列中。 - BRPOPLPUSH source destination timeout:阻塞的 其他与上面相同
- LLEN key:获得List长度
- LRANGE key start stop:在列表中获取指定返回的元素 不会报错,end>length的情况会默认end为length,start>end会返回空集合
- LINDEX key index: 获取元素,时间复杂度为O(n),-1表示最后一个元素,下标超出会返回nil
- LSET key index value:设置队列里一个元素的值
- LREM key count value:该命令用于从key对应的list中,移除前count次出现的值为value的元素。count>0标识左到右移除值为value的元素;count<0标识右到左移除值为value的元素;count=0标识移除所有值为value的数
- LTRIM key start stop:就参数用法而言类似LRANGE,不过这个会对list进行裁剪,start到stop之间的元素会作为新队列覆盖的队列中
- LINSERT key BEFORE|AFTER privot value:将value插入key对应列表的基准值privot的前面候着后面,key不存在不会产生操作,key存在但不是List会报错,找不到privot会返回-1,只匹配匹配到的第一个数据
Hash:
可以堪称具有string key和string value的容器,因此非常适合存储对象,如果hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间,每一个hash可以存储4294967295(无符号整数的十进制最大值)个键值对
- HSET key field value:为指定的key设置field/value键值对
- HMSET key field value [field value …]:为指定的key设置多个键值对
- HGET key field:获取指定key中的field值
- HMGET key field [field …]:获取指定key中多个field值对应的值
- HGETALL key:获取指定key下所有的field-value值
- HDEL key field [field …]:删除key下指定的field
- DEL key:删除整个hash
- HINCRBY key field increment:设置key中的field的值增加increment,若指定槽位未存储数字类型的数据,会抛出异常
- HEXISTS key field:判断当前key的field是否存在
- HLEN key:获取当前key所包含的field的数量
- HKEYS key:获取key的所有field
- HVALS key:获取所有的value
Set:
Set和List都是字符串序列,非常相似,不同的点是Set是用Hash表来保证字符串的唯一性,且没有先后顺序,不像List一样能够在首位增删数据。
- SADD key members [members …]:往key中添加Set成员,members重复后只触发一次保存操作,不会报错
- SMEMBERS key:查看set的全部元素
- SISMEMBER key member:判断是否key中存在member
- SREM key member [member …]:删除key中值等于member的数据
- SCARD key:查询key中的set的数据项数量
- SRANDMEMBER key:输出key中的set中的随机一个数据项
- SPOP key:随机删除key中的set中的一个数据项并返回
- SMOVE source destination member:从key为source的set中提取member数据项加入到destination的set中
- SINTER key [key …]:求多个key的交集,如果key只有一个的话,返回key对应的Set
- SUNION key [key …]:求多个key的并集
- SDIFF key [key …]:求多个key的差集
Sorted Set:
SortedSet与Set极为相似,他们都是字符串的集合,都不允许重复的成员出现在一个set集合中,区别是SortedSet每一个成员都会有一个分数(Score)与之关联,redis通过分数来为那个集合指定的成员进行从大到小的排序,然而SortedSet成员是唯一的,但是Score是可以重复的。
在SortedSet中添加删除更新都是极快的操作,时间复杂度为集合中成员数量的对数,并且因为位置有序,所以访问集合中部的成员也是非常高效的,适用于一些游戏排名或者微博热点等场景
- ZADD key [NX|XX] [CH] [INCR] score member [score member …]:将成员和成员的分数存放的sortedset中,如果该元素已存在,会用新的分数替换原有的分数,返回加入的个数。
- ZSCORE key member:获取指定成员的分数
- ZCARD key:查询集合中成员数量
- ZREM key member1 member2:移除集合中指定的成员,可指定多个
- ZRANGE key start end [withscores]:获取集合中start到end的成员,后面的可选参数表明是否返回分数
- ZREVRANGE key start stop [withscores]:按照元素分数从大到小的顺序返回从start到stop之间的所有元素,包括两端,后面可选参数表明是否返回分数
- ZREMRANGEBYRANK key start stop:按照排名名次的范围删除元素,(0,2)表明前三位
- ZREMRANGEBYSCORE key start stop:按照分数范围删除元素
- ZINCRBY key increment member:设置指定成员增加分数,返回更改后的分数
- ZCOUNT key min max:获取分数在[min,max]之间的成员,前后包含
- ZRANK key member:从小到大返回该元素的排名
- ZREVRANK key member:从大到小返回该元素的排名