redis介绍
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助
读的速度是110000次/s,写的速度是81000次/s 。
redis使用场景
作为缓存使用
原始业务设计
平台监控高频次访问数据
高频统计、复杂的统计数据
业务数据的特殊性
系统功能的升级优化
redis的数据类型
redis数据存储格式,自身类似于Map,其中所有的数据类型都是采用key:value 的形式存储 数据类型指的是存储的数据的类型
string (类似于string)
存储的单个数据 value = “string” 存储的内容通常使用字符串,如果字符串已证书的形式展示,可以当数字操作使用 一个存储空间存储一个字符串
基本操作
基本指令 解释 set key value 添加、修改数据 get key 获取数据 del key 删除数据 mset key1 value1 key2 value2 …(m是Multiple-多个的简写) 添加或修改多个数据 mget key1 key2 … 获得多个数据 strlen key 获取字符串长度 append key value 在字符串后面追加
set 和 mset的选择 :
多指令时需要考虑,根据指令长度、指令执行时间,进行合理指令切割
string 扩展操作
业务场景
数据库分表操作保证id的统一性(id不重复)
解决方案
string作为数值操作
string类型在redis内部存储默认就是一个字符串,当遇到 incr 、decr操作 转成数值进行运算 redis 所有操作都是原子的,采用单线程,不会有产生并发问题 redis数值上线范围时 java中long数据的最大值 2的63次方减一 9,223,372,036,854,775,808 - 1
这两种方法都可使用负数参数造成相反操作
设置数值类型增加指定范围的值 (increment – 增长)
incr key 数值类型的加一操作 incrby key increment 数值类型按照指定数值增长 incrbyfloat key increment 按照给定的小数增长 (结果变成非数值类型之后不可以使用 incr 、 incrby 操作) 设置数据库类型减少指定范围的值
decr key 数值类型的减一操作 decrby key increment 数值类型按照指定数值增长
业务场景
比如微信投票,4小小时之内可以投一票 、 热点新闻三天后线下、session不活跃失效
解决方案
string设置生命周期
setex key seconds value 设置 秒内有效 psetex key milliseconds value 设置 毫秒内有效、
string 注意事项
数据操作不成功的反馈与数据正常操作之间的差异
表示运行结果是否成功
(integer)0 -> false 失败 (integer)1 -> true 成功 表示运行结果的值
(integer)3 -> 3 3个 (integer)1 -> 1 1个 数据没获取到
数据的最大存储量 512MB 数值计算最大范围 (java中long的最大值)
string 应用场景
主页高频访问信息显示控制 例如微博粉丝数与微博数量
例如
保存用户的信息
user:id:2504551:fans -> 12345671 可以代表user表的id为2504551的这条数据fans的值为12345671 利用json格式保存
user:id:2504551 -> {id:2504551,fans:12345671} 代表user表id为2504551这条数据的json格式
string key的设置约定
hash (类似于hashMap)
一个存储空间存储多个 field - value 结构
如果field数量较少,存储结构优化为类似数组结构 如果fileld数量较多,存储结构使用类似HashMap结构
基本操作
基本指令 解释 hset key field value 添加、修改数据 hget key field 获取数据 hgetall key 获取数据 hdel key feild field2 删除数据 hmset key field value field1 value1 …(m是Multiple-多个的简写) 添加或修改多个数据 mget key field1 feild2 … 获得多个数据 hlen key 获取哈希表字段的数量 hexiste key field 获取hash表是否存在指定的字段
扩展操作
获取hash中所有字段名或字段值
设置指定字段数值增加指定范围的值
hincrby key field increment hincrbyfloat key field increment 如果key有对应的值则不变,没有值则加入进入
注意事项
hash 类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套异常。如果数据未获取到,对应的值为(nil) 每个hasj可以存储 2的32次放减一个键值对 hash类型十分贴近对象的数据存储形式,并且可灵活添加删除对象属性。但hash设计的初衷不是为了存储大量对象设计的,更不可以将hash作为对象列表使用 hgetall 操作可以获取全部属性,如果内部field过多,遍历整体数据效率会很低,有可能成为数据访问瓶颈
hash应用场景
电商网站购物车设计与实现
list (类似于LinkedList)
数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分 list类型:保存多个数据 ,底层使用双向链表 数据结构
基本操作
基本指令 解释 lpush key value1 value2 … 添加数据 rpush key value1 value2 … 添加数据 lrange key start stop 获取数据 (range 范围) lindex key index 获取数据 lllen key 获取长度 del key 删除数据 lpop 获取并移除数据 srpop 获取并移除数据
扩展操作
规定时间内获取并移除数据
blpop key [key2] timeout 等待时间后 获取并删除数据 brpop key [key2] timeout 设置指定字段数值增加指定范围的值
hincrby key field increment hincrbyfloat key field increment 如果key有对应的值则不变,没有值则加入进入
移除指定的数据
常应用于具有操作顺序 栈或者队列 或者查询分页
set (类似于HashSet)
存储大量的数据,在查询方面提供更高的效率 它是由hash结构变形而来的
基本操作
添加操作 sadd key member1 member2 获取全部数据 smembers key 删除数据 srem key member member2 获取set数据总量scard key 判断集合中是否包含指定元素 sismember key member
扩展操作
sorted_set (类似于TreeSet)
持久化
RDB
RDB的启动方式
save 命令 阻塞redis线程 bgsave 后台执行保存操作 调用fork函数生成子进程 启动的时候加载的数据 配置 save second changes 时间范围内 多少key发生裱花进行持久化
AOF
以独立的日志方式记录每次写明亮,重启时执行AOF文件中命令达到恢复数据的目的
事务
redis 事务