redis 作为一个内存数据库已经被许许多多的公司使用,它的性能非常的优秀,读写速度支持非常快而且支持 10w 的 qps 。今天我们就来学习下它的丰富的数据类型。
redis 数据类型redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(有序集合)。
string(字符串)字符串类型是redis的最基本数据结构。 字符串类型的值实际可以为字符串,数字,二进制,但是值最大不能超过512m。
keyvalue
hello world
counter 1
bits 10000100
json {id:1,name:xiaocai,age:18}
string命令设置
set key value [ex seconds] [px milliseconds] [nx|xx]
get key
> set name xiaocaiok> get namexiaocai过期
setex key seconds value
> set name1 redis1 ex 10 #10秒后过期ok > get name1(nil)> setex name2 10 redis2 #10秒后过期ok > get name2redis2 > get name2(nil)> set name3 redis3 px 10 #10豪秒后过期ok > get name3(nil)不存在才能设置成功或者必须存在才能设置成功
> set hello world nx #不存在才能设置成功ok > set hello w nx #存在就设置失败(nil) > get helloworld>set hello w xx #存在才能设置成功ok > set world hello xx #不存在就设置失败(nil) > get hellow > get world(nil)批量设置
mset key value [key value ...]mget key [key ...]> mset name1 redis1 name2 redis2ok> mget name1 name21) redis12) redis2> mget name1 name2 name31) redis12) redis23) (nil)计数
incr key
incrby key increment
> set age 18 #value只能为整数ok > incr age(integer) 19 > incrby age -5(integer) 14 > incrby age 10(integer) 24删除
del key [key ...]
> del age(integer) 1> get age(nil)内部编码int 8个字节的长整型embstr 小于等于39个字节的字符串raw 大于39个字节的字符串> set port 6379ok> object encoding portint> set hello worldok> object encoding hello embstr> set longstring abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzok> object encoding helloraw> strlen longstring(integer) 52list(列表)list类型是用来存储多个有序的字符串。每列字符串称之为元素。一个list的最大存储为2^32-1个元素。可以对列表进行双端插入和弹出,也可以指定索引下标获取元素。
list命令头部和尾部添加元素
lpush key value [value ...]
rpush key value [value ...]
lrange key start stop
> lpush letter a(integer) 1> lpush letter b(integer) 2> lpush letter c(integer) 3> lrange letter 0 -11) c2) b3) a> rpush letter a(integer) 4> rpush letter b(integer) 5> rpush letter c> lrange letter 0 -11) c2) b3) a4) a5) b6) c头部和尾部弹出元素
lpop key
rpop key
> lpop letterc> lpop letterb> lrange letter 0 -11) a2) a3) b4) c> rpop letterc> rpop letterb> lrange letter 0 -11) a2) a索引操作 索引需要对全部list进行遍历,性能会随着元素个数的增大而变差
lrange key start stop
lindex key index
ltrim key start stop
len key
> rpush letter b c(integer) 4> lrange letter 0 -11) a2) a3) b4) c> lindex letter 2b> ltrim letter 0 -2ok> lrange letter 0 -11) a2) a3) b> llen letter(integer) 3插入
insert key before|after pivot value
> linsert letter before b c(integer) 4> linsert letter after a d(integer) 5> lrange letter 0 -11) a2) d3) a4) c5) b修改
set key index value
> lset letter 2 bok> lrange letter 0 -11) a2) d3) b4) c5) b内部编码ziplist(压缩列表):小于3.2版本,当元素个数小于list-max-ziplist-entries配置(默认512个),同时每个元素的值长度都小于list-max-ziplist-value配置(默认64字节)linkedlist(链表):小于3.2版本,不满足ziplist的条件quicklist:redis 3.2版本,以一个ziplist为节点的linkedlist> object encoding letterquicklisthash (哈希)hash是一个string类型的field和value的映射表。 它适合用于存储对象,它是无序的,不能使用索引操作。
hash命令设置
hset key field value
> hset user:1 name zhangsan(integer) 1> hset user:1 age 18(integer) 1获取和获取所有的field-value
hget key field
hgetall key
> hget user:1 namezhangsan> hgetall user:11) name2) zhangsan3) age4) 18删除
hdel key field [field ...]
> hdel user:1 age(integer) 1> hdel user:2 age(integer) 0长度
hlen key
> hlen user:1(integer) 1批量设置
hmset key field value [field value ...]
> hmset user:2 name lisi age 23ok> hmget user:2 name age1) lisi2) 23> hlen user:1(integer) 1> hlen user:2(integer) 2是否存在
hexists key field
> hexists user:2 name(integer) 1> hexists user:2 city(integer) 0所有的field和所有的value
hkeys key
hvals key
> hkeys user:11) name> hkeys user:21) name2) age> hvals user:11) zhangsan> hvals user:21) lisi内部编码ziplist(压缩列表):当元素个数小于hash-max-ziplist-entries配置(默认512个)和每个元素大小小于hash-max-ziplist-value配置(默认64字节)时hashtable(哈希表):不满足ziplist条件时> object encoding user:1ziplist修改配置文件hash-max-ziplist-entries为5
> hmset test t1 v1 t2 v2 t3 v3 t4 v4 t5 v5 t6 v6ok > object encoding testhashtableset(集合)用来保存多个字符串元素,无序的,不能有重复元素,不能使用索引下标获取元素。一个集合可以存储2^32-1个元素。
set命令增加
add key member [member ...]
> sadd user:1:tag it music news(integer) 3> sadd user:1:tag bike news(integer) 1删除
srem key member [member ...]
> srem user:1:tag bike(integer) 1个数
scard key
> scard user:1:tag(integer) 3是否存在
sismember key member
> sismember user:1:tag bike(integer) 0> sismember user:1:tag it(integer) 1随机返回指定个数
srandmember key [count]
> srandmember user:1:tagnews> srandmember user:1:tag 31) news2) music3) it随机弹出
spop key [count]
> spop user:1:tagnews> srandmember user:1:tag 31) music2) it所有个数
smembers key
> smembers user:1:tag1) music2) it交集
sinter key [key ...]
> sinter user:1:tag user:2:tag1) music2) it并集
sunion key [key ...]
> sunion user:1:tag user:2:tag1) music2) java3) run4) it差集
sdiff key [key ...]
> sdiff user:1:tag user:2:tag(empty list or set) > sadd user:1:tag sleep(integer) 1 > sdiff user:1:tag user:2:tag1) sleep > sdiff user:2:tag user:1:tag1) java2) run内部编码intset(整数集合):元素都是整数和元素个数小于set-max-intset-entries配置(默认512个)时hashtable(哈希表):不满足intset时> object encoding user:1:taghashtable> sadd numbers 1 2 3 4 5(integer) 5> object encoding numbersintsetzset(有序集合)zset保证了元素不能重复,每个元素都有一个分数(score)作为排序的依据。
zset命令添加
zadd key [nx|xx] [ch] [incr] score member [score member ...]
> zadd books 8.2 redis in action(integer) 1> zadd books 9.3 effective java: second edition : java(integer) 1> zadd books 9.1 think in java(integer) 1> zadd books 9.3 python cookbook 9.0 effective python(integer) 2个数
zcard key
> zcard books(integer) 5升序返回范围的成员
zrange key start stop [withscores]
> zrange books 0 -11) redis in action2) effective python3) think in java4) effective java: second edition : java5) python cookbook> zrange books 2 51) think in java2) effective java: second edition : java3) python cookbook升序返回成员时带上分数
> zrange books 0 -1 withscores 1) redis in action 2) 8.1999999999999993 3) effective python 4) 9 5) think in java 6) 9.0999999999999996 7) effective java: second edition : java 8) 9.3000000000000007 9) python cookbook10) 9.3000000000000007> zrange books 2 5 withscores1) think in java2) 9.09999999999999963) effective java: second edition : java4) 9.30000000000000075) python cookbook6) 9.3000000000000007精度问题:内部 score 使用 double 类型进行存储,所以存在小数点精度问题withscores:带上分数降序
zrevrange key start stop [withscores]
> zrevrange books 0 -1 withscores 1) python cookbook 2) 9.3000000000000007 3) effective java: second edition : java 4) 9.3000000000000007 5) think in java 6) 9.0999999999999996 7) effective python 8) 9 9) redis in action10) 8.1999999999999993指定value的score
zscore key member
> zscore books think in java9.0999999999999996根据score的数值区间升序
zrangebyscore key min max [withscores] [limit offset count]
> zrangebyscore books 0 9.1 withscores1) redis in action2) 8.19999999999999933) effective python4) 95) think in java6) 9.0999999999999996根据score的数值区间降序
zrevrangebyscore key max min [withscores] [limit offset count]
> zrevrangebyscore books 9.1 0 withscores1) think in java2) 9.09999999999999963) effective python4) 95) redis in action6) 8.1999999999999993根据score的数值降序输出所有元素
> zrevrangebyscore books +inf -inf withscores 1) python cookbook 2) 9.3000000000000007 3) effective java: second edition : java 4) 9.3000000000000007 5) think in java 6) 9.0999999999999996 7) effective python 8) 9 9) redis in action10) 8.1999999999999993+inf 正无穷-inf 负无穷删除
zrem key member [member ...]
> zrem books effective java: second edition : java(integer) 1增加分数
zincrby key increment member
> zincrby books 2 redis in action10.199999999999999> zincrby books -1 redis in action9.1999999999999993交集
zinterstore destination numkeys key [key ...] [weights weight] [aggregate
> zadd textbooks 8 chinese 9 english 9.5 mathematics(integer) 3> zadd textbooks 9.2 think in java(integer) 1> zrange books 0 -11) redis in action2) effective python3) think in java4) python cookbook> zrange textbooks 0 -11) chinese2) english3) think in java4) mathematics> zinterstore newbooks 2 books textbooks(integer) 1> zrange newbooks 0 -11) think in java并集
zunionstore destination numkeys key [key ...] [weights weight] [aggregate
> zunionstore newunionbooks 2 books textbooks(integer) 7> zrange newunionbooks 0 -11) chinese2) redis in action3) effective python4) english5) python cookbook6) mathematics7) think in java内部编码ziplist(压缩列表):元素个数小于zset-max-ziplist-entries配置(默认128个)和元素长度小于zset-max-ziplist-value配置(默认64b)时skiplist(跳跃表):不满足ziplist时> object encoding booksziplist总结这篇文章主要是学会基础的 redis 数据类型和基本的 api 以及每个数据类型背后的原理。
TASMO-自动测试建模好帮手
科创板澜起科技董事李亚军介绍、履历信息
RT-Thread开发GD32F450添加adc外设
不将就:一加5搭载骁龙835,今夏不见不散!
适用于Arduino的RF操纵杆的制作
Redis数据类型介绍
安科瑞智能化分布式光伏运维监控系统的作用
格芯宣布与安森美半导体达成最终协议
什么是电平
为什么网络安全对医疗设备很重要
Nokia 2720翻盖手机宣布于12月24日发布
NP2302FVR-J(20 v n沟道增强型MOSFET)
土壤墒情监测站的应用为农业生产提供科学数据支撑
酸蓄电池是怎样生产出来的?
路灯光控开关GUK-81/2/3/4/电路原理图
51单片机指令集详解 51单片机布尔操作指令集详解
TIMC案触礁,施颜祥提出3大处理原则
Glue Collaboration致力于发展商业VR社交平台 加快商业化进程
国产分布式IO模块-对标西门子
荣耀8青春版测评:荣耀8青春版与红米Note4x,都如此靓丽你会选谁?