redis是一种NoSql,是一种非关系型数据库,以K-V的方式存储数据,不依赖于业务逻辑,不支持ACID,不遵循SQL标准,性能上远超关系型数据库,适用于高并发的场景及海量数据读写,对数据具有高扩展性。常见的NoSql数据库有:
redis底层是单线程+IO多路复用
二进制安全类型,可以包含任何数据,\n,'\0’等,是redis中最基本的数据类型,redis中一个string类型value最大可以有512MB
string 类型支持的操作有下面这些内容:
set k1 zxcvbn 设置k1值zxcvbn,多次set同一个key会进行覆盖
get k1 获得k1的值
append k1 a 在库k1对应的值尾部添加a,成功后返回value总长度
strlen k1 获得k1对应值的长度
setnx k1 v1 当库k1不存在时设置值,存在时不覆盖返回0
incr k2 当值为数字类型时,可以给k2所对应的值进行+1
decr k2 当值为数字类型时,可以给k2所对应的值进行-1
incrby k2 10 给k2所对应的值加上自定义步长10
decrby k2 10 减10
incr的操作是原子的
mset k1 v1 k2 v2 …同时设置多个键值对
mget k1 k2 … 同时获得多个键值对
msetnx k1 v1 k2 v2 … 也是同时设置多个值,如果其中有一个以上key存在,会失败,所有key不存在时才会成功,是一个原子性的操作
getrange k1 start_pos end_pos 获取k1指定起始和终点位置的下标,如假如k1值为myredis,getrange k1 1 2 返回yr,是一个左右都闭合的区间,下标从0开始。
setrange k1 pos abc 将abc插入到k1对应的值中,从值的第pos个位置开始,如set k1 2 abc,会返回myrabcedis
setex key expire_time value 设置key的值为value并且过期时间为expiretime
getset key value 获取key的值并用新的value替换原值
string类型是一种简单字符串,会进行动态扩容,会提前预分配空间以减少内存分配,字符串的实际分配空间一般都会高于实际字符串的长度,当字符串长度小于1M时,会加倍扩容,大于1M时,扩容只会多扩1M的内存。
redis list是单键多值的一种数据结构,一个key可以对应一整个列表的值,列表是双向列表,是插入有序的,可以选择头插或尾插(左右插值),双端操作性能较高,列表中部操作性能较差
lpush/rpush k1 v1 v2 v3 往k1中坐插/右插入一个或多个值
lrange k1 start end 获取k1中start 到end下标对应的值内容(从左到右),如果是坐插,那么会获得v3,v2,v1,rpush则会获得v1,v2,v3
lrange k1 start -1表示获取start之后所有的值
lpop/rpop k1 从左边或右边取出来一个值,如果值全取出来了,key也就不存在了
rpoplpush k1 k2 从k1的链表右边取一个值插入到k2的左边
index key index 根据索引下标取到对应元素
len key 获取列表长度
linsert k1 before/after value new_value 往k1所对应链表中value值前面/后面插入new_value值
lrem key n value 从左边开始删除n个value
lset key index value 将key链表下标index的值替换成value
redis底层实现为quicklist,在元素较少时,会使用一块连续的内存,使用ziplist,它把所有元素紧挨着一起存储,数据量较多时才使用quicklist,元素多的时候是将多个压缩链表用链表串起来,做到了快速的插入删除和减少空间冗余。
redis的set是自动去重的,并且是无序的,是一个无序的string集合。底层是一个value为null的hash表,添加、删除、查找的复杂度为O(1)。
sadd k1 v1 v2 v3往集合k1中插入v1,v2v3,如果是重复的value将被忽略。
smembers k1 取出k1集合中所有元素
sismember k1 v1 判断v1是否在库k1集合中,在返回1,不在返回0
scard k1 查看k1集合中元素个数
srem k1 v1 v2 … 删除集合中的元素v1,v2,返回删除的个数
spop k1 随机从集合k1中吐出一个值
srandmember k1 n 随机从集合k1中去除n个值,不会删除值
smove source dest value 把集合source中的value移动到dest集合
sinter k1 k2 取两个集合的交集
sunion k1 k2 取两个集合的并集
sdiff k1 k2 取两个集合的差集,实际上也可以sdiff k1 k2 k3,但是按顺序来做diff的,返回的是在k1中,不在k2(及k3)中的元素,如果没有返回空
底层实现是用hash表做的字典。
redishash 是一个键值对集合。这个hash表是一个string类型的field和value映射表。适用于存储对象。
hset key field value 给集合key 中插入一个以field为key,value为值的对象
hget key field 从集合key中获取field对应的值
hmset key field1 v1 field2 v2 … 一次批量设置hash值
hexists key field 查看key集合中,field是否存在
hkeys key 列出key集合所有的field
hvals key 列出key集合所有field对应的值
hincrby key field n 给集合key的filed所对应的值加上n
hsetnx key field value 给集合key添加一对kv对,当且仅当不存在field
zset也是一个没有重复元素的字符串集合,集合每个元素包含了一个分值,根据分值进行排序,元素的key不能重复,但分值是可以有相等的分值存在
zadd k1 score1 value1 score2 value2 … 往集合中添加元素
zrange k1 start end 取出下标start到end的元素,不包含score,如果想要连score一起取出来,在后面添加withscores
zrangebyscore k1 minmax [withscores] [limit offset count] 取出由我们限定的最小到最大范围之间的元素
zrevrangescore k1 max min [withscores] [limit offset count] 按max到min的顺序,取出在其之间的元素
zincrby k1 50 member 给指定member成员的score加上50
zcount k1 200 300 统计k1集合中200 - 300的score之间有多少个元素
zrem k1 value 删除k1集合中给定值的元素
zrank k1 value 查看指定value的排序位置,下标都是从0开始
(1)使用hash关联了元素及其score,元素名称作为field,元素score作为值;
(2)使用跳表给元素value排序,根据score范围获取元素列表