本文共 6801 字,大约阅读时间需要 22 分钟。
每种基本类型数据结构都有自己的底层的内部编码实现。
Redis 这样设计有两种好处:
第一,它可以改进内部编码,而对外的数据结构和命令没有影响,这样一旦开发出更优秀的内部编码,无需改动外部数据结构和命令。
第二,多种内部编码实现可以再不同的场景发挥各自的优势。
Redis 使用了单线程架构和 I/O 多路复用模型来实现高性能的数据库服务。
为什么单线程还这么快?
第一,纯内存访问
第二,非阻塞 I/O
第三,单线程避免了线程切换和竞态产生的消耗。
键都是字符串类型
字符串类型的最大值不能超过512MB
set key ex seconds value #设置秒级过期时间set key px milliseconds value #设置毫秒级过期时间set key value nx #键不存在时,设置成功set key value xx #键存在时,设置成功,常用于更新操作setex key secends value #类似于exsetnx key value #类似于nx
get key
mset key value[ key value...]
mget key[key...]
incr key #自增decr key #自减incrby key #自增指定数字decrby key #自减指定数字incrbyfloat #自增浮点数
不常用命令
append key value
strlen key
getset key value
setrange key offset value
getrange key start end
字符串类型内部编码有三种:
缓存功能
计数
共享Session
限速
hset user:1 name tom
hget user:1 name
hdel user2 name
hmset user:2 name huangxuwei age 21 city chenzhouOKhmget user:2 name city1) "huangxuwei"2) "chenzhou"
hlen user:1
hexists user:1 name
hkeys user:21) "name"2) "age"3) "city"
hvals user:21) "huangxuwei"2) "21"3) "chenzhou"xxxxxxxxxx 127.0.0.1:6379>
hgetall user:21) "name"2) "huangxuwei"3) "age"4) "21"5) "city"6) "chenzhou"
哈希类型与关系型数据库的区别
三种方法缓存用户信息
一个列表最多可以存储2的32次方减1个元素
有序可重复
127.0.0.1:6379> rpush listkey key a b c d 1 2 3 4,5 #添加(integer) 9127.0.0.1:6379> lrange listkey 0 -1 #查看1) "key"2) "a"3) "b"4) "c"5) "d"6) "1"7) "2"8) "3"9) "4,5"127.0.0.1:6379> lpop listkey #左删除"key"127.0.0.1:6379> rpop listkey #右删除"4,5"127.0.0.1:6379> lrem listkey 1 a #删除指定元素(integer) 1127.0.0.1:6379> lrange listkey 0 -1 1) "b" 2) "c" 3) "d" 4) "e" 5) "f" 6) "g" 7) "h" 8) "i" 9) "j"10) "k"11) "l"12) "m"13) "n"127.0.0.1:6379> ltrim listkey 1 8 #保留指定区间OK127.0.0.1:6379> lrange listkey 0 -11) "c"2) "d"3) "e"4) "f"5) "g"6) "h"7) "i"8) "j"127.0.0.1:6379> llen listkey #获取长度(integer) 4
127.0.0.1:6379> rpush listkey java cpp python(integer) 3127.0.0.1:6379> lrange listkey 0 -11) "java"2) "cpp"3) "python"127.0.0.1:6379> lset listkey 1 javaee #修改指定索引下标的元素OK127.0.0.1:6379> lset listkey 2 springOK127.0.0.1:6379> lrange listkey 0 -11) "java"2) "javaee"3) "spring"
blpop key [key...] timeout
口诀:
无序互异性
一个集合最多包含2的32次方减1个元素
Redis 不仅支持集合的增删查改,还支持集合取交集,并集,差集。
集合内:
sadd myset test a b c d
srem myset test
scard myset
127.0.0.1:6379> SMEMBERS myset1) "c"2) "d"3) "a"4) "b"
sismember myset a
127.0.0.1:6379> srandmember myset 21) "b"2) "a"
127.0.0.1:6379> spop myset"c"127.0.0.1:6379> smembers myset1) "d"2) "a"3) "b"
集合间:
127.0.0.1:6379> sadd user1 follow it music his sports(integer) 5127.0.0.1:6379> sadd user2 follow it news ent sports(integer) 5127.0.0.1:6379> sinter user1 user21) "follow"2) "it"3) "sports"
127.0.0.1:6379> sunion user1 user21) "sports"2) "follow"3) "music"4) "news"5) "his"6) "ent"7) "it"
127.0.0.1:6379> sdiff user1 user21) "his"2) "music"
127.0.0.1:6379> sinterstore user1_2 user1 user2(integer) 3127.0.0.1:6379> SMEMBERS user1_21) "sports"2) "follow"3) "it"
sinterstore:原命令+store
有序互异
集合内:
127.0.0.1:6379> zadd user:ranking 251 tom(integer) 1127.0.0.1:6379> zadd user:ranking 251 tom 123 huang 11 xu 13 wei 222 2cosmos
zrank key memberzrevrank key member127.0.0.1:6379> zrank user:ranking xu(integer) 0127.0.0.1:6379> zrevrank user:ranking xu(integer) 4
127.0.0.1:6379> zrem user:ranking huang xu(integer) 2
127.0.0.1:6379> zrange user:ranking 0 21) "2cosmos"2) "tom"3) "wei"127.0.0.1:6379> zrange user:ranking 0 2 withscores1) "2cosmos"2) "222"3) "tom"4) "251"5) "wei"6) "10013"
127.0.0.1:6379> zincrby user:ranking 100000000 2cosmos"100000222"127.0.0.1:6379> zrange user:ranking 0 2 withscores #zrevrange 逆序1) "tom"2) "251"3) "wei"4) "10013"5) "2cosmos"6) "100000222"
127.0.0.1:6379> zrangebyscore user:ranking 1 100000 withscores1) "tom"2) "251"3) "wei"4) "10013"
127.0.0.1:6379> zcount user:ranking 1 100000 (integer) 2
127.0.0.1:6379> zremrangebyscore user:ranking (250 +inf(integer) 3127.0.0.1:6379> zrangebyscore user:ranking 1 inf withscores(empty array)
集合间:
127.0.0.1:6379> zinterstore user:ranking:1_inter_2 2 user:rang:1 user:rang:2(integer) 3127.0.0.1:6379> zrange user:ranking:1_inter_2 0 -1 withscores1) "wei"2) "2"3) "xu"4) "24"5) "huang"6) "182"
127.0.0.1:6379> zunionstore user:ranking:1_union_2 2 user:rang:1 user:rang:2(integer) 5127.0.0.1:6379> zrange user:ranking:1_union_2 0 -1 withscores 1) "wei" 2) "2" 3) "xu" 4) "24" 5) "cosmos" 6) "99" 7) "cosmosweis" 8) "99" 9) "huang"10) "182"
排行榜系统
rename key newkey
rename之前,newkey 已经存在的话,它的值会被覆盖。
为了被强行 rename,Redis 提供了 renamenx 命令
randomkey
expire key secends #键在secends秒后过期expireat key timesamp #键在秒级时间戳 timesamp 后过期ttl #查看剩余过期时间pttl #查看毫秒级过期时间pexpire key millisecends #键在millisecends秒后过期pexpireat key millisecends-timesamp #键在秒级时间戳 timesamp 后过期
无论过期时间是时间戳,秒级,还是毫秒级,Redis 内部最终使用的都是 pexpireat。
对于字符串类型键,执行 set 命令会去掉过期时间。
persist 命令可以将过期时间清除。
Redis 不支持二级数据结构内部元素的过期功能,例如不能对列表类型的一个元素设置过期时间。
setex 命令作为set + expire 的组合,不但是原子执行,同时减少了一次网络通信。
Redis 2.8 之后:scan 命令
scan 并不能保证完整的遍历出来所有的键。
Redis 3.0 以后在弱化这个功能,Redis Cluster 只允许使用0号数据库
为什么:
转载地址:http://alqzi.baihongyu.com/