redis之string的常用api和使用场景
命令参考
string的值最大不能超过512M。
redis命令参考:http://redisdoc.com/index.html
建议大家学习redis的时候,先将string、hash、list、set和zset这五种常用的数据结构的api去学习一下。
常用api
SET
SET key value [EX seconds] [PX milliseconds] [NX|XX]
可选参数
- EX seconds : 将键的过期时间设置为 seconds 秒。 执行 SET key value EX seconds 的效果等同于执行 SETEX key seconds value 。
- PX milliseconds : 将键的过期时间设置为 milliseconds 毫秒。 执行 SET key value PX milliseconds 的效果等同于执行 PSETEX key milliseconds value 。
- NX : 只在键不存在时, 才对键进行设置操作。 执行 SET key value NX 的效果等同于执行 SETNX key value 。
- XX : 只在键已经存在时, 才对键进行设置操作。
使用场景
- 分布式锁
参考redis官方:https://redis.io/topics/distlock
SET resource_name my_random_value NX PX 30000
建议使用redisson,能减少很多问题:如生存时间到了,程序的逻辑还没有完成,锁提前释放等问题
- 缓存数据
将数据以json串的形式存储到数据库,以用户数据为例:
set user:id:1 {id:1,name:zhangsan}
优点:简化编程,如果合理的使用序列化可以提高内存的使用效率。
缺点:序列化和反序列化有一定的开销,同时每次更新属性都需要把全部数据取出进行反序列化,更新后再序列化到Redis中。
STRLEN
STRLEN key
返回键 key 储存的字符串值的长度,每个中文占用3个字节。
MSET
MSET key value [key value …]
同时为多个键设置值。
如果某个给定键已经存在, 那么 MSET 将使用新值去覆盖旧值, 如果这不是你所希望的效果, 请考虑使用 MSETNX 命令, 这个命令只会在所有给定键都不存在的情况下进行设置。
MSET 是一个原子性(atomic)操作, 所有给定键都会在同一时间内被设置, 不会出现某些键被设置了但是另一些键没有被设置的情况。
批量存储值,能减少网络io的时间。
使用场景
- 缓存数据
如果使用json的方式缓存数据不便于修改,如果使用如下方式缓存数据方便修改:
MSET u:1:name zhangsan u:sex:1 male
//如果需要修改name
SET u:1:name lisi
优点:简单直观,每个属性都支持更新操作。
缺点:占用过多的键,内存占用量较大,同时用户信息内聚性比较差,所以此种方案一般不会在生产环境使用。
内部编码
字符串类型的内部编码有3种:
- int:8个字节的长整型。
- embstr:小于等于39个字节的字符串。
- raw:大于39个字节的字符串。
Redis会根据当前值的类型和长度决定使用哪种内部编码实现。
使用如下命令可查看:
object encoding key
开发提示
与MySQL等关系型数据库不同的是,Redis没有命令空间,而且也没有对键名有强制要求(除了不能使用一些特殊字符)。但设计合理的键名,有利于防止键冲突和项目的可维护性,比较推荐的方式是使用“业务名:对象名:id:[属性]”作为键名(也可以不是分号)。
例如MySQL的数据库名为vs,用户表名为user,那么对应的键可以用"vs:user:1","vs:user:1:name"来表示,如果当前Redis只被一个业务使用,甚至可以去掉“vs:”。如果键名比较长,例如“user:{uid}:friends:messages:{mid}”,可以在能描
述键含义的前提下适当减少键的长度,例如变为“u:{uid}:fr:m:{mid}”,从而减少由于键过长的内存浪费。
常用场景
- 缓存功能
- 计数,使用incr、incrby
- 共享Session
- 限速
参考:
Redis开发与运维
http://redisdoc.com