Redis数据类型
数据类型 | 可以存储的值 | 操作 | 具体操作 | 应用场景 |
---|---|---|---|---|
String | 字符串、整数或者浮点数 | 对整个字符串或者字符串的其中一部分执行操作 | 对整数和浮点数执行自增或者自减操作 INCR 自增 DECR 自减 | 计数器 |
List | 列表 | 从两端压入或者弹出元素 | 对单个或者多个元素,进行修剪 LPUSH(RPUSH) key value1[value2] 只保留一个范围内的元素 LRANGE key start stop | 对大数据的删减 任务队列 |
Set | 无序集合 | 添加、获取、移除单个元素 | 检查一个元素是否存在于集合中;SISMEMBER key member 计算交集(SINTER)、并集(SUNION) 差集(SDIFF);SDIFF key1[key2] 从集合里面随机获取元素 SRANDMEMBER key [count] | 共同关注、共同喜好、二度好友 |
Hash | 包含键值对的无序散列表 | 添加、获取、移除单个键值对 | 获取所有键值对 HGETALL key 检查某个键是否存在 HEXISTS key field | 存储对象(数据库表 |
Zset | 有序集合 | 添加、获取、删除元素 | 根据分值范围或者成员来获取元素 ZRANGE key start stop[WITHSCORES] ;计算一个键的排名 | 排行榜 |
1.1Redis的键Key
> DEL key 删除键
> EXISTS key 判断key是否存在
> DUMP key 序列化key
> EXPIRE key seconds 给key设置过期时间
> TTL key key的生存剩余时间(秒为单位)
> PTTL key key的生存剩余时间(毫秒单位)
> PERSIST key 移除key的过期时间,将持久保留
> KEYS pattern 查找所有符合给定模式的key(* 所有 ?一个字符)
> RANDOM key 从当前数据库随机返回一个key
> RENAME key newkey 修改key名称
> MOVE key db 当前数据库移动到给定数据库中
key的应用场景
(1)限时的活动信息
(2)网站的数据缓存(对于一些要定时更新的数据如积分排行榜)
(3)手机验证码
(4)限制网站的访问频率
1.2 Redis的值value
1.2.1 String类型
> SET key_name value 设置给定key的值(key存在则覆盖,不存在则新建)
> SETNX key_name value 设置给定key的值(key不存在时)
> GET key_name 取值
> GETRANGE key start end 字符串截取
> GETBIT key offset 对key所存储的字符串值,获取指定偏移量上的位
> MGET key1 [key2..] 获取一个或多个key的值
> GETSET key_name value 设置key值,并返回key的旧值
> STRLEN key 获取长度
> DEL key_name 删除
> INCR key_name 自增
> DECR key_name 自减
> APPEND key_name value 字符串拼接
string应用场景
1.String通常用于保存单个字符串或JSON字符串数据
2.因string是二进制安全的,所以你完全可以把一个图片文件的内容作为字符串来存储
3.计数器(常规key-value缓存应用。(常规计数:微博数,粉丝数)
- INCR等指令本身就具有原子操作的特性,所以我们完全可以利用redis的INCR.INCRBY.DECR,DECRBY等指令来实现原子计数的效果。不少网站都利用redis的这个特性来实现业务上的统计计数需求。
1.2.2 List类型
> LPUSH key value1[value2] 将一个或多个值插入列表头部
> RPUSH key value1[value2] 将一个或多个值插入列表尾部
> LPUSHX key value 将一个或多个值插入列表头部,列表不存在则操作无效
> RPUSHX key value 将一个或多个值插入列表尾部,列表不存在则操作无效
> LLEN key 获取列表长度
> LINDEX key index 通过索引获取列表元素
> LRANGE key start stop 获取列表指定范围内的元素
> LPOP key 左移除
> RPOP key 右移除
> BLPOP key1[key2] timeout 移除并获取列表的第一个元素,没有元素就会阻塞队列
直到等待超时或发现可弹出元素
list应用场景
1、对数据量大的集合数据删减
- 列表数据显示关注列表、粉丝列表、留言评价、分页、热点新闻(Top5)等 利用LRANGE还可以很方便的实现分页的功能。
2、任务队列
- (list通常用来实现一个消息队列,而且可以确保先后顺序,不必像MySQL那样还需要通过ORDERBY来进行排序)
任务队列介绍(生产者和消费者模式):
在处理Web客户端发送的命令请求时,某些操作的执行时间可能会比我们预期的更长一些,通过将待执行任务的相关信息放入队列里面,并在之后对队列进行处理,用户可以推迟执行那些需要一段时间才能能完成的操作,这种将工作交给任务处理器来执行的做法被称为任务队列(task queue)。
3、 RPOPLPUSH source destination
移除列表的最后一个元素,并将该元素添加到另一个列表并返回示例描述:
常用案例:订单系统的下单流程、用户系统登录注册短信等
1.2.3 Hash类型
> HSET key field value 为指定的key,设定field/value
> HMSET key field value[field1,value] 同时将多个field-value 设到key中
> HGET key field 根据field等待value
> HMGET key field[field1] 获取key所有给定字段的值
> HGETALL key 返回hash表所有字段和值
> HKEYS key 获取哈希表中的字段
> HLEN key 获取哈希表中字段的数量
> HDEL key field[field2] 删除一个或多个hash表字段
> HSETNX key field value 只有在字段不存在时,设置字段值
> HINCRBY key field increment key中指定字段的整数值加增量
> HINCRBYFLOAT key field increment 指定字段的浮点数加增量
> HEXISTS key field 指定字段是否存在
hash应用场景
1、 常用于存储一个对象
2、 **为什么不用string存储一个对象? **
hash是最接近关系数据库结构的数据类型,可以将数据库一条记录或程序中一个对象转换成hashmap存放在redis中。
用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储,主要有以下2种存储方式:
(1)用户ID作为查找key,把其他信息封装成一个对象以序列化的方式存储,这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时, 需要把整个对象取回,并且修改操作需要对并发进行保护,引入CAS等复杂问题。`
(2)这个用户信息对象有多少成员就存成多少个key-value对,用用户ID+对应属性的名称作为唯一标识来取得对应属性的值,虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据,内存浪费还是不可观的。`
总结:
Redis提供的Hash很好的解决了这个问题,Redis 的Hash实际是内部存储的Value为一个Hashmap,并提供了直接存取这个Map成员的接口
1.2.4 Set类型
赋值语句
> SADD key member1[member2] 添加一个或多个成员
取值语句
> SCARD key 获取成员数
> SMEMBERS key 返回集合中的所有成员
> SISMEMBER key member 判断是否存在
> SRANDMEMBER key [count] 返回集合中一个或多个随机数
删除语句
> SREM key member 移除一个或多个
> SPOP key[count] 移除并返回集合中的一个随机元素
> SMOVE source destination member 将member从source移到destination
差集语句
> SDIFF key1[key2] 返回给定集合的差集(左侧)
> SDIFFSTORE destination key1[key2] 返回差集并存到destina.
交集语句
> SINTER key1 [key2] 返回给定集合的交集
> SINTERSTORE destination key1[key2] 返回交集并存到destination
并集
> SUNION key1[key2] 返回并集
> SUNIONSTORE destination key1[key2] 返回并集并存储在destination
set应用场景
常应用于:对两个集合间的数据[计算]进行交集、并集、差集运算
1、以非常方便的实现如共同关注、共同喜好、二度好友等功能。对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存储到一个新的集合中。
2、利用唯一性,可以统计访问网站的所有独立IP
1.2.5 Zset类型
赋值语句
> ZADD key score1 member1[score member2] 添加一个或多个成员
取值语句
> ZCARD key 获取成员数
> ZCOUNT key min max 计算集合中指定区间分数的成员数
> ZRANK key member 返回有序集合中指定成员索引
> ZRANGE key start stop[WITHSCORES] 返回指定区间内成员[低到高]
> ZREVRANGE key start stop[WITHSCORES] 返回指定区间内成员[高到低]
删除语句
> ZREM key member[member...] 移除有序集合中的一个或多个成员
Zset应用场景
常应用于:
排行榜
1)比如twitter的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。
2)比如一个存储全班同学成绩的Sorted Set, 其集合value可以是同学的学号,而score就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。
3)还可以用Sorted Set来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。