一、简介
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
二、String
命令
keys * | 查询key列表 |
set 名称 值 | 添加或修改值 |
get 名称 | 获取值 |
del 名称 | 删除值 |
mset 名称 值 名称 值 | 批量添加或修改 |
mget 名称 名称 | 批量获取值 |
strlen 名称 | 获取值得长度 |
append 名称 值 | 在原有值得基础上追加新的内容,返回最终值的长度 |
incr 名称 | 每执行一次对数值加一,,自增效果 |
decr 名称 | 每执行一次对数值减一,,自减效果 |
incrby 名称 数字值 | 对数值增加指定的整数值 命令数值可以为负 |
decrby 名称 数字值 | 对数值减少指定的整数值 命令数值可以为负 |
incrbyfloat 名称 数字值 | 对数值增加指定的浮点值 |
setex 名称 有效时间 值 | 添加值并对此值设置有效时间 时间单位为秒 |
psetex 名称 有效时间 值 | 添加值并对此值设置有效时间 时间单位为毫秒 |
String的应用场景
1.用于数据库表的主键控制;
2.主页高频访问信息控制,如新浪微博大V关注数
String类型数据操作注意事项
1.数据操作不成功的反馈与数据正常操作之间的差异
① 表示运行结果是否成功
(integer) 0 — false 失败
(integer) 1 — true 成功
② 表示运行结果
(integer) 3 — 3 3 个
(integer) 1 — 1 1 个
2.数据未获取到
(nil)等同于null
3.数据最大存储值
512MB
4.数值计算最大识别范围(java中的long的最大值)
9223372036854775807
5.key的设置约定
表名:主键名:主键值:字段名
三、Hash
命令
hset key field value | 添加修改数据 |
hget key field | 获取数据 |
hdel key field1 [field2] | 删除数据 |
hmset key field1 value field2 value | 批量添加修改数据 |
hget key field1 field2 | 批量获取数据 |
hlen key | 获取值的field的个数 |
hexists key field | 查询是否存在此字段 |
hkeys key | 获取哈希表中所有的字段 |
hvals key | 获取哈希表中所有的字段的值 |
hincrby key field increment |
指定字段的数值增加指定的整数数值 |
hincrbyfloat key field increment | 指定字段的数值增加指定的浮点数或者整数数值 |
hgetall key | 获取当前key下所有信息 |
hsetnx key field value | 当此key中存在插入的field时,会新增数据失败,不存在时新增成功 |
应用场景
电商网站购物车的设计和实现
注意事项
hash类型下的value只能存储字符串,不允许存其他数据类型,不存在嵌套现象.如果数据未获取到,对应的值为(nil)
每个hash可以存储 2^23-1个键值对
hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存
储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
hgetall操作可以获取全部属性,如果内部field过多,遍历整体数据效率就会很低,有可能成为数据访问瓶颈
四、list
数据存储要求:存储多个数据,并对数据存储的顺序进行区分
list类型:保存多个数据,底层使用双向链表存储结构实现
lpush key value1 [value2] | 左添加/修改 |
rpush key value1 [value2] | 右添加/修改 |
lrange key startindex stopindex | 获取list的下标起始到结束的数据,下标根据需求填写 |
lindex key index | 获取所选下标的list的值 |
llen key | 获取当前list的元素个数 |
lpop key | 获取并删除最左边的数据 |
rpop key | 获取并删除最右边的数据 |
blpop key1 [key2] timeout | 规定时间内获取并删除所有list其中一个list的最左边的数据 |
brpop key1 [key2] timeout | 规定时间内获取并删除所有list其中一个list的最右边的数据 |
lrem key count value | 删除指定数据 count表示删除value的个数 |
应用场景
微信朋友圈点赞
微博关注列表的顺序显示
依靠队列解决多路信息汇总问题,如多服务器日志汇总
list操作注意事项
保存的数据都是String类型的,最多存储2^32-1个
具有索引概念,但操作数据是通常以队列形式进行入队出队操作,或以栈的形式入栈出栈操作
获取全部数据操作结束索引设置为-1
list可以对数据进行分页操作,通常第一页的信息来自list
五、set
新的存储需求,存储大量的数据,在查询方面提供更高的效率
需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询
set类型:与hash存储结构完全相同,仅存储键,不存储值,存储的键不允许重复
命令
sadd key member1 [member2] | 添加修改数据 |
smembers key | 获取数据 |
srem key member1 [member2] | 删除数据 |
scard key | 获取集合数据的个数 |
sismember key member | 校验member是否存在,存在返回1,不存在返回0 |
srandmember key [count] | 随机获取集合中指定数量的数据 |
spop key | 随机获取集合中某个数据并删除 |
sinter key1 [key2] | 获取两个集合的交集 |
sunion key1 [key2] | 获取两个集合的并集 |
sdiff key1 [key2] | 获取两个集合的差集 |
sinterstore destination key1 [key2] | 获取两个集合的交集且存储到指定的集合,指定的集合如果原来有数据,则会被清空 |
sunionstore destination key1 [key2] | 获取两个集合的并集且存储到指定的集合,指定的集合如果原来有数据,则会被清空 |
sdiffstore destination key1 [key2] | 获取两个集合的差集且存储到指定的集合,指定的集合如果原来有数据,则会被清空 |
smove source destination member | 将指定数据从原始集合移动到目标集合 |
业务场景
用于随机推介类的检索,如QQ音乐每日推介
用于同类信息的关联检索,如支付宝中与好友拥有的共同好友显示
统计网站的PV日访问量,UV(cookie),IP
注意事项
set不允许重复添加
set的存储结构与hash相同,单无法启用hash的存储空间