前提
Redis提供的丰富的数据结构也是redis受欢迎的重要原因之一,Redis提供了五种数据结构,理解每种数据结构特点以及api对redis的使用是非常重要的。而且数据结构也是Redis的关键。
数据结构
redis五种数据结构包括字符串,哈希,列表,集合,有序集合,再次基础上划分非集合和集合两大类。本文小编主要介绍一下非集合类,也就是字符串和哈希两种。
在介绍结构的之前介绍一下通用的key,众所周知,redis是键值对的形式。redis中键类似关系数据库中唯一标识,大部分方法也类似于关系数据库中的主键的操作,其中唯一特殊就是键值过期的情况,关于一些有时间节点的数据,适用expire就是很好的方式。
key值设计原则
不是使用一些特殊字符,比较合理设计—-表名:主键:id值(业务名:对象名:id:[属性])
这样的设计有利于防止键冲突和项目的可维护性,而且需要在能清楚描述键含义的前提下适当减少键的长度,从而减少键过长造成资源浪费
key使用方式
redis中支持key的模糊查询,有如下三种方式
*:通配任意多个字符
?:通配单个字符
[]:通配括号中某1个字符
randomkey 随机获取redis中key值(这一部分可以用于抽奖之类的业务)
rename key newkey 为key赋一个新key名
如果newkey已经存在,则会被覆盖
renamenx key newkey 当newkey不存在的时候才会修改成功
ttl key 返回key的生命周期 (秒数)
persist key 设置key永久有效
move key db 将当前数据库key移动到指定db中
字符串类型基础的操作如下
- 设置值
set key value [ex seconds] [px milliseconds] [nx|xx]
(ex 秒过期级别,px 毫秒,nx键值不存在,才可以(添加操作);xx键存在才可以(更新操作))
setnx setxx等同于 nx,xx
批量设置值
mset key value [key value ….] - 获取值
get key
批量获取值
mget key [key …] - 自增以及自减
incr key 自增
decr key 自减
incrby key increment 指定自增数字
decrby keyincrement 指定自减数字 - 设置新值并返回原值
getset key value - 类似stringbuffer功能
拼接string
append key value
字符串长度
strlen key
替换指定字符
setrange key offeset value
获取部分字符串(从零开始)
getrange key start end
字符串类型编码
字符串类型有当前值的字符长度决定使用哪种编码方式
- int: 8个字节长度
- embstr:大于8个字节小于39个字节
- raw:大于39个字节
Hash基本操作方式
hash一般的命令和String很相似,就是在string的使用方法前h用于区分,例如以下命令
- 设置值 hset key field value
- 获取值 hget key field
- 删除field hdel key field
- 批量设置或获取 field-value
hmset key field value [field value…]
hmget key field [field]
- 判断field是否存在 hexists key field
- 计算value长度 hstrlen key field
和String类型不同有
- 获取field个数– hlen key
- 获取所有field– hkeys key
- 获取所有value– hvals key
- 获取所有field-value– hgetall key
Hash编码
ziplist(压缩列表)
在节省内存方面比较优秀hashtable
读写效率比较高,但是当hashtable作为hash的编码内部实现的时候,ziplist的读写效率会下降
field的个数小于512个,而且value的小于64字节,hash使用ziplist作为内部编码实现否则使用hashtable作为内部编码实现
使用情景
String
1. 与MySQL做缓存
2. 做Session共享
3. 计数,如视频的播放次数
4. 利用setnx做分布式锁
5. 限速,利用expire过时机制,避免非法的频繁访问
Hash
1.替代关系数据库,例如将用户信息,使用id为主键,其他属性作为field字段
总结
之前在项目使用redis通常都是当做缓存来使用,对于redis的很多使用方式不是很了解,对个人来说redis的了解很少,所以会用的很少,主要是最基础的内容学习,再结合项目进而有成效的优化系统