了解一下Redis API和怎么使用它(上)
作者 | 川石信息
来源 | 今日头条
(一)、全局命令
Redis常见全局命令有以下几种:
1.查看所有键
keys *
2.键总数
dbsize
3.检查键是否存在
如果键存在则返回1,不存在则返回0
exists key
4.删除键
del key [key ...]
5.键过期
expire key seconds
TTL命令会返回键的剩余过期时间,它有3种返回值:
- 大于等于0的整数:键剩余的过期时间。
- -1:键没设置过期时间。
- -2:键不存在
(二)、字符串
1.设置值
除了set选项,Redis还提供了setex和setnx两个命令:
它们的作用和ex和nx选项是一样的。下面的例子说明了set、setnx、setxx的区别。
setnx和setxx在实际使用中有什么应用场景吗?以setnx命令为例子,由于Redis的单线程命令处理机制,如果有多个客户端同时执行setnx key value,根据setnx的特性只有一个客户端能设置成功,setnx可以作为分布式锁的一种实现方案。
典型场景:
如果没有从Redis获取到用户信息,需要从MySQL中进行获取,并将结果回写到Redis,添加1小时(3600秒)过期时间。
2.获取值
get key
3.批量设置值
mset key value [key value ...]
4.批量获取值
mget key [key ...]
5.计数
典型场景:
例如笔者所在团队的视频播放数系统就是使用Redis作为视频播放数计数的基础组件,用户每播放一次视频,相应的视频播放数就会自增1。
long incrVideoCounter(long id) {
key = "video:playCount:" + id;
return redis.incr(key);
}
很多应用出于安全的考虑,会在每次进行登录时,让用户输入手机验证码,从而确定是否是用户本人。
但是为了短信接口不被频繁访问,会限制用户每分钟获取验证码的频率,例如一分钟不能超过5次。
上面是一种常用命令,下面是一些不常用命令:
1.追加值
append key value
2.字符串长度
strlen key
3.设置并返回原值
getset key value
4.设置指定位置的字符
5.获取部分字符串
getrange key start end
127.0.0.1:6379> getrange redis 0 1 "be"
(三)、哈希
1.设置值
hset key field value
127.0.0.1:6379> hset user:1 name tom
(integer) 1
2.获取值
hget key field
127.0.0.1:6379> hget user:1 name
"tom"
3.删除field
4.计算field个数
hlen key
127.0.0.1:6379> hlen user:1
(integer) 3
5.批量设置或获取field-value
6.判断field是否存在
hexists key field
127.0.0.1:6379> hexists user:1 name
(integer) 1
7.获取所有field
hkeys key
127.0.0.1:6379> hkeys user:1
1) "name"
2) "age"
3) "city"
8.获取所有value
hvals key
127.0.0.1:6379> hvals user:1
1) "mike"
2) "12"
3) "tianjin"
9.获取所有field-value
10.hincrby hincrbyfloat
hincrby key field
hincrbyfloat key field
hincrby和hincrbyfloat,就像incrby和incrbyfloat命令一样,但是它们的作用域是filed。
11.计算value的字符串长度
hstrlen key field
127.0.0.1:6379> hstrlen user:1 name
(integer) 3
哈希数据类型一般用于存储用户信息。哈希存储结构
1.原生字符串类型:每个属性一个键
set user:1:name tom
set user:1:age 23
set user:1:city beijing
优点:简单直观,每个属性都支持更新操作。
缺点:占用过多的键,内存占用量较大,同时用户信息内聚性比较差,所以此种方案一般不会在生产环境使用。
2.序列化字符串类型:将用户信息序列化后用一个键保存
set user:1 serialize(userInfo)
优点:简化编程,如果合理的使用序列化可以提高内存的使用效率。
缺点:序列化和反序列化有一定的开销,同时每次更新属性都需要把全部数据取出进行反序列化,更新后再序列化到Redis中。
3.哈希类型:每个用户属性使用一对field-value,但是只用一个键保存
hmset user:1 name tomage 23 city beijing
优点:简单直观,如果使用合理可以减少内存空间的使用。
缺点:要控制哈希在ziplist和hashtable两种内部编码的转换,hashtable会消耗更多内存。
写的很全,收藏了