目录
Redis的数据类型
一、String类型
String是Redis中最基本的数据类型,一个key对应一个value,数据结构为简单动态字符串,是可以修改的字符串,内部结构类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存分配频繁,当前字符串实际分配的空间capacity一般高于实际字符串长度len,当字符串长度小于1M时,每次扩容呈翻倍扩容,如果超过1M,扩容一次只会增加1M,最大不超过512M
String是二进制安全的,意味着Redis的String可以包含任何数据,比如jpg图片,或者序列化的对象。
String相关指令
1、添加数据
①、set
set key value --设置相同的key变为更新
②、mset
mset key1 value1 key2 value2........ --同时设置多个key value
③、setnx
setnx key value --当不存在key时才设置
④、msetnx
msetnx key1 value1 key2 value2 key3 value3 ...... --同时设置多个key value,仅当key不存在时才可添加,原子性操作,当一个key设置失败,其他都失败
⑤、setex
setex key second value --添加数据同时设置过期时间
⑥、getset
getset key value --获取值同时替换新值
②、获取数据
①、get
get key
②、mget
mget key1 key2 key3 --同时获取多个值
3、append
append key --追加value
4、setrange
setrange key 起始位置 --复写部分value
5、getrange
getrange key 起始位置 结束位置 --截取部分value
6、strlen
strlen key --得到String的长度
7、数字型value自增自减1 原子性操作
①、incr
incr key 自增1
②、decr
decr key 自减1
8、数字型value自增自减任意数 原子性操作
①、incrby
incrby key 步长 增长20
②、decrby
decrby key 步长 减少20
二、List类型
List类型属于一键多值类型,Redis的列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部(左边),或者尾部(右边)
它的底层是个双向链表,对两端的操作性能很高,但是通过索引下标的操作中间节点的性能会比较差
List类型常用指令
List的数据结构为快速链表QuickList,首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是Ziplist(压缩列表),它将所有元素紧挨着一起存储,分配的是一块连续的内存,当数据量比较多的时候才会改成Quicklist,因为普通的链表需要附加指针空间太大,浪费空间。比如一列表里只存int类型的数据,结构上还需要两个额外的指针prev和next。Redis将链表和Ziplist结合起来成了QuickList,也就是将多个Ziplist使用双向指针串起来。
1、插入数据
①、lpush
lpush key value1 value2 value3 .... --从左边插入,插入的结果为 value3 value2 value1
②、rpush
rpush key value1 value2 value3 .... --从右边插入,插入的结果为 value1 value2 value3
2、删除数据(取出数据)
①、lpop
lpop key --从左边弹出一个值,value就会把这个值去掉,当所有值弹出去时,key不存在
②、rpop
rpop key --从右边弹出一个值,value就会把这个值去掉,当所有值弹出去时,key不存在
3、rpoplpush
rpoplpush key1 key2 --从key1右边取一个值放到key2的左边
4、lrange
lrange key 起始坐标 结束坐标 --从左开始获取list的坐标范围内的值,0到-1表示获取所有值
5、lindex
lindex key index --从左边开始按照下表获取值
6、llen
llen key --获取链表的长度
7、linsert
linsert key before|after ”目标值“ ”插入的值“ --在目标值后面或者前面插入一个值
8、lrem
lrem key 个数 ”目标值“ -- 从左边开始删除n个目标值
9、lset
lset key index ”替换值“ --从左边开始替换指定下标的value值
三、Set类型
Redis Set 对外提供的功能与list类似,是一个列表的功能,特殊之处在于set是可以自动排重的,并且Set提供了一个判断成员是否存在一个set集合的重要接口,是list所没有的,Redis Set是String类型的无序集合,底层其实就是value为null的hash表,所以添加、删除、查找的复杂度都是0(1)
Redis Set数据结构是一个Dict字典,字典使用哈希表实现的,所有的value都指向一个内部值
1、sadd
sadd key value1 value2 value3 --将多个元素添加到集合key中,如果元素存在则自动忽略
2、smembers
smembers key --从集合中获取所有元素,不删除
3、sismember
sismember key value --查询集合中是否存在value元素
4、scard
scard key --返回集合中的元素个数
5、rem
srem key value --从集合中删除value元素
6、spop
spop key --随机从集合中吐出(删除)一个元素,当集合中的元素都被吐出,集合就不存在了
7、srandmember
srandmember key 数量 --从集合中随机获取n个元素,不会删除元素
8、smove
smove key1 key2 value --将value元素从set集合key1移动到set集合key2 中
9、sinter
sinter key1 key2 --求两集合中的交集
10、sunion
sunion key1 key2 --求两集合的并集
11、sdiff
sdiff key1 key2 --求两集合的差集
四、Hash类型
Redis Hash是一个键值对集合,值是一个field和value的映射表,Hash特别适合用来存储对象,类似java里面的Map <String,Object>。例如存储一个user对象,key是user value可以是{id :1 ,name: zhangsan , age:18}
Redis Hash 类型对应的数据结构有两种,ZipList,Hashtable,当field-value长度较短且个数较少的时候使用ZipList,否则使用Hashtable
1、hset
hset key1 field1 value1 key2 field2 value2 key3 field3 value3 ..... --添加数据
2、hget
hget key field --获取key中某个属性的值
3、hexists
hexists key field 判断key中某个属性是否存在
4、hkeys
hkeys key 列出该集合中所有的field
5、hvals
hvals key 查改该集合中所有的value
6、hincrby
hincrby key field n --集合中某个和属性自增n
7、hsetnx
hsetnx key field value 添加一个值,仅当该值不存在时才能添加成功
五、Zset类型
Redis有序集合Zset与普通集合非常相似,是一个没有重复元素的集合,不同之处是有序集合的每个成员都关联了一个评分(score),这个评分被用来按照从低分到最高分的方式排序集合中的成员,集合成员是唯一的,但是评分是可以重复的。
Zset使用了两个数据结构,Hash以及跳跃表.
1、zadd
zadd key score value score1 value1 score2 value2..... --添加数据
2、zrange
zrange key 起始下标 结束下标 withscores --查询下标范围内的值,携带分数
3、zrangebyscore
zrangebyscore key min max whithscores --按照分数进行排序,返回携带分数
4、zrevrangebyscore
zrevrangebyscore key max min withcores --按照范围内分数从大到小排序
5、zincrby
zincrby key n value 将key集合中的value的分数增大n
6、zrem
zrem key value 删除集合中的某个元素
7、zcount
zcount key min max --查询在分数区间内共有几个元素
8、zrank
zrank key value --查询集合中某个元素的排名