数据类型 | 说明 |
---|---|
String | 是Redis中最基本的数据类型,二进制安全的,它可以包含任意数据类型。如图片。Redis中String类型的数据上限的512M |
Hash | 是一个string类型的field和value的映射表,hash特别适合用于存储对象。Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿 ) |
List | Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素) |
Set | Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员) |
ZSet | 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员) |
redis登陆:[root@i redis-4.0.12]# ./src/redis-cli
五种数据类型的数据的结构差异所以命令也不尽相同,但是还是有一些相通的命令。所以此处先介绍下通用命令
SELECT命令
在redis中,默认一共有16个数据库,编号为0-15,正常情况下,
用户登录成功后,首先看到的是0号库,可以手动切换为其他库
使用 : 127.0.0.1:6380> select 4
DEL命令
该命令用于在 key 存在时删除 key,返回数字表示删除的记录数
使用: 127.0.0.1:6379> del name
DUMP命令
序列化给定 key ,并返回被序列化的值。如果key不存在返回nil
使用: 127.0.0.1:6379> dump name
"\x00\x03dpb\t\x00\xe5\xa2\xc4\xd1\xfc\xb2\xd9\xcb"
EXISTS命令
检查key是否存在,1表示存在,0表示不存在
使用: 127.0.0.1:6379> exists name
(integer) 1
EXPIRE命令
是指有效时间,单位秒
使用: 127.0.0.1:6379> expire name 120
(integer) 1
127.0.0.1:6379> ttl name
(integer) 112 //112是剩余的有效时间。
TTL命令
以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)
-2表示key不存在,-1表示没有设置有效时间,不会过期,我们可以通过EXPIRE key 设置有效时间
使用: 127.0.0.1:6379> ttl name
(integer) -1
PEXPIRE命令
同样是设置过期时间,只是单位是毫秒
使用: 127.0.0.1:6379> pexpire name 100
(integer) 1
127.0.0.1:6379> ttl name
(integer) -2 //100毫秒比较短暂,-2表示已经不存在了。
PTTL命令
和ttl命令一样,只是返回单位是毫秒
使用: 127.0.0.1:6379> pexpire name 100000
(integer) 1
127.0.0.1:6379> ttl name
(integer) 91
127.0.0.1:6379> pttl name
(integer) 84601
KEYS
通过正则表达式查找符合条件的key,
使用: 127.0.0.1:6379> keys * //keys * 查询所有的key
1) "age"
2) "address"
3) "sex"
RANDOMKEY
从当前数据库中随机返回一个key
TYPE命令
返回key对应的数据类型,不存在返回的是none
使用:127.0.0.1:6379> type name
none
127.0.0.1:6379> type age
string
127.0.0.1:6379> type sex
string
RENAME
修改key的名称
使用: 127.0.0.1:6379> rename age age1
OK
127.0.0.1:6379> exists age
(integer) 0
flushdb
清空当前库 慎用!!!
flushall
清空所有库 慎用!!!
命令 说明
set 设置key的值
get 获取对应的key的值
strlen 获取key的值的长度
append 在原有的value的基础上追加内容
incr 将key存储的内容加1
incrby 将key存储的内容加指定的值
incrbyfloat 将key存储的内容累加一个float类型的数据
decr 将key存储的内容减1
decrby 将key存储的内容减去指定的值
getrange 截取value的值
setrange 修改value的部分内容,根据偏移量修改
getset 获取设置key的值并返回原来的旧值
mget 批量获取值
mset 批量设置值
setex 设置key对应的value,同时设置过期时间,单位是秒
psetex 设置key对应的value,同时设置过期时间,单位是毫秒
setnx 只有在 key 不存在时设置 key 的值,set if not exists
msetnx 兼具了mset和setnx的特性
Redis中字符串的存储方式都是以二进制的方式存储的。
比如:
127.0.0.1:6379> set k1 a
OK
k1的值为a,对应的ascii码是97,转换为二进制就是01100001。BIT命令就是对这个二进制数据进行操作的。
不常用,能优化到这说明你蛮强的了!
命令 说明
getbit 获取二级制中对应偏移量的值
setbit 设置对应二进制位的值
bitcount 统计二进制中位中为1的个数
bitop 对二进制数据做位元操作,与,或,非,异或操作
bitpos 返回字符串里面第一个被设置为1或者0的bit位
在实际开发过程中我们肯定会碰到很多需要存储对象的需求,此时hash就比较合适了。hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
命令 说明
hset 设置key中字段的值
hget 获取key中字段的值
hmset 批量设置key中的字段
hmget 批量获取key中字段的值
hdel 删除key中指定的字典
hsetnx 设置key中的字段的值,如果字段存在就忽略
hvals 获取key中所有的字段的值
hkeys 获取key中的所有的字段
hgetall 获取key中的所有的字段及值
hexists 判断key中的字段是否存在
hincrby 将key中的字段增加特定的值
hincrbyfloat 和hincrby类似增加的float类型的数据
hlen 获取key中的字段的个数
hstrlen 获取key中某个字段的值得长度
有序,可重复
列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) 一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
命令 说明
lpush 向列表头部添加一个或多个元素
lrange 获取列表中指定的元素0第一个,-1最后一个
rpush 向列表尾部添加一个或多个元素
llen 获取列表长度
lset 通过index设置列表的值
rpop 移除列表最后一个元素,并返回
lpop 移除列表头部元素,并返回
lindex 获取列表中对应下标的值
ltrim 截取列表对应的元素
blpop lpop的阻塞版
brpop rpop的阻塞版
rpoplpush 移除一个列表的最后一个元素,并将该元素添加到另一个列表的头部
brpoplpush rpoplpush的阻塞版本
无序,不可重复
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
命令 说明
sadd 添加一个或多个元素到集合中,如果集合中存在该元素则忽略
scard 返回集合中的元素的个数
sismember 判断集合中是否含有某元素
smembers 获取集合中的所有的元素
srem 删除集合中指定的元素
srandmember 随机返回集合中的元素,版本2.6后在命令之后可以跟一个count。指定随机返回的元素个数
spop 和srandmember类似,只是spop会将获取的元素移除而srandmember不会移除元素
smove 将元素从一个集合移动到另一个集合中
sdiff 返回两个集合的差集
sdiffstore 和sdiff类似,不同的是会将差集结果保存起来
sinter 获取两个集合的交集
sinterstore 和sinter类似,不同的是将结果保存起来了
sunion 获取两个集合的并集
sunionstore 获取两个集合的并集并保存起来
上面介绍了Redis中的Set集合,Set集合是无序的不可重复的。而下面要介绍的ZSet其实是在Set的基础上绑定了一个score来实现集合数据按照score排序的集合
有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
命令 说明
zadd 向有序集合中添加一个或多个 分数/元素对
zscore 获取有序集合中元素对应的分数
zrange 获取集合中的元素,如果加上withscores则会连同分数一并返回
zrevrange 和zrange类似,只是将结果倒序了
zcard 返回集合中元素的个数
zcount 统计集合中分数在min和max之间的元素个数
zrangebyscore 可以根据score范围查找元素
zrank 获取元素在集合中的排名,从小到大,最小的是0
zrevrank 获取元素在集合中的排序,从大到小
zincrby 给元素增加分数,如果不存在就新创建元素,并赋予对应的分数
zinterstore 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
zrem 从集合中删除一个元素
zlexcount 计算有序集合中指定字典区间内成员数量
zrangebylex 获取指定区间的元素,分数必须相同
Redis 发布订阅(pub/sub)是一种消息通信模式:
发送者(pub)发送消息
订阅者(sub)接收消息
Redis 客户端可以订阅任意数量的频道
订阅消息
客户端订阅消息的命令如下
使用: 127.0.0.1:6379> subscribe c1 c2 c3
发送消息如下命令
127.0.0.1:6379> publish c1 "hello redis"
(integer) 1
127.0.0.1:6379> publish c2 'hehe'
(integer) 1
客户端同时会接收到消息:
127.0.0.1:6379> subscribe c1 c2 c3
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "c1"
3) (integer) 1
1) "subscribe"
2) "c2"
3) (integer) 2
1) "subscribe"
2) "c3"
3) (integer) 3
1) "message"
2) "c1"
3) "hello redis" #接收到c1发送的消息
1) "message"
2) "c2"
3) "hehe" #接收到c2发送的消息
模式订阅消息
客户端在订阅消息的时候还可以通过模式匹配订阅的方式订阅,如下
订阅
127.0.0.1:6379> psubscribe c*
发送消息,没有区别
127.0.0.1:6379> publish c1 "hello redis"
接收消息
127.0.0.1:6379> psubscribe c*
切记,发布订阅要注意网络连接断开的话需要重新连接,此时就会有可能数据的丢失。这个需要注意