Redis数据类型
Redis支持的数据类型:string,hash,list,set, zset(sorted set有序集合)
String 字符串
- redis最基本的类型,你可以理解为与Memcached一模一样的模型,一个key 对应一个 value
- 二进制安全,表示redis的string 可以包含任何数据,比如jpg图片或者序列化的对象
- 一个键最大能存储512MB
命令 | 描述 |
---|---|
set | 存key - value |
get | 根据key获取value |
nx | 若key 已存在,则返回nil,不替换 |
xx | 若key 已存在,则替换value,默认也是替换 |
mset | 批量存 |
mget | 批量取 |
- set 与 get
127.0.0.1:6379> set name 'just'
OK
127.0.0.1:6379> get name
"just"
- nx 与 xx
127.0.0.1:6379> set name just2 nx
(nil)
127.0.0.1:6379> set name just2 xx
OK
127.0.0.1:6379> get name
"just2"
- mset 与 mget
127.0.0.1:6379> mset a 1 b 2 c 3
OK
127.0.0.1:6379> mget a b
1) "1"
2) "2"
redis处理字符串数据,若value是基本类型-Integer,则可以进行‘加、减’运算
命令 | 描述 |
---|---|
incr | value + 1 |
incrby | value + n |
desr | value - 1 |
desrby | value - n |
127.0.0.1:6379> incr counter
(integer) 101
127.0.0.1:6379> incr counter
(integer) 102
127.0.0.1:6379> get counter
"102"
127.0.0.1:6379> decr counter
(integer) 101
127.0.0.1:6379> decrby counter 55
(integer) 46
127.0.0.1:6379> incrby counter 22
(integer) 68
而且,incr 这类操作是原子性的,当多个客户同时操作相同key counter时永远不会产生竞争条件(只有竞争条件的存在,才会发生资源竞争问题),因为redis不会让多台客户端对一个key同时执行修改操作
在之前的操作中,可以看到返回的数据往往都是最新的值,那么如果返回修改前value的值呢?
命令 | 描述 |
---|---|
getset | 替换 value值,返回旧值 |
127.0.0.1:6379> getset counter 55
"68"
如果你想自增counter,来记录系统的访问量,然后希望每一小时收集一次,则可以使用getset;
其他比较有用的命名:
命令 | 描述 |
---|---|
exists | 判断key是否存在,存在返回1,不存在返回0 |
del | 删除key, 删除成功返回1,不成功0 |
type | 判断key的数据类型,不存在返回none |
自行验证了~
Redis expires
Redis期望keys的存在是有时间的,即过一段时间后进行删除,我们可以为key设置‘存在时间’
- 时间可以是秒也可以是毫秒
- 然而,期望时间是 1 millisecond 为单位
- 这个时间是存储在磁盘上的,不管服务是否启动,都会删除
有设置生存时间的,当然也有设置永久存在的命令 persist
命令 | 描述 |
---|---|
expire | 为某一key设置存在时间,当key已存在情况下 |
ex | 在set key ex 添加key 中使用 |
persist | 将某一key设置为永久存在 |
ttl | 查看key剩余存在时间,秒;若key已经不存在返回-2;若永久存在返回-1 |
pttl | 查看key剩余存在时间,毫秒;若key已经不存在返回-2;若永久存在返回-1 |
127.0.0.1:6379> set name aaa
OK
127.0.0.1:6379> expire name 10 ## 存在10s
127.0.0.1:6379> ttl name
(integer) 4
127.0.0.1:6379> ttl name ##已删除
(integer) -2
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> set name aaa ex 100
OK
127.0.0.1:6379> persist name ## 永久存在
(integer) 1
127.0.0.1:6379> pttl name ##返回-1
(integer) -1
127.0.0.1:6379> save ## 保存到磁盘
OK
127.0.0.1:6379> expire name 30 ##设置存在30s
(integer) 1
127.0.0.1:6379> get name ##关闭服务,30后再连接
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> get name ## 可以看到关闭服务也会删除
(nil)