目录
1.5:zset(有序集合,数据有序,不能重复,但是分值可以一样)
1.6:HyperLogLog(2.8版本新增,用于做基数统计算法)
1:redis基本数据类型和作用
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
1.0:redis基础命令
redis命令 | 说明 |
del a | 删除a的key |
keys * | 查询所有的key |
keys n* | 模糊查询 |
EXISTS a | 查询a的key是否存,返回0或者1 |
EXPIRE a 20 | 设置a的过期时间,时间单位是秒 |
PEXPIRE a 5000 | 设置a的过期时间,时间单位毫秒 |
PERSIST a | 删除a的过期时间 |
PTTL a | 返回a的过期时间 单位是毫秒 |
TTL a | 返回a的过期时间 单位是秒 |
RENAME a aa | 将a改成aa |
TYPE aa | 返回aa的类型 |
1.1:string(字符串)
长度是512M,存储字符串
String命令 | 说明 | 实战用法 |
set key value | 单个key赋值 | 常用设置缓存 |
get key | 单个key取值 | 常用获取缓存 |
getrange key start end | 获取key的子字符 | |
getset key value | 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。 | |
mset key value [key value ...] | 同时设置一个或多个 key-value 对。 | |
mget key[key1 key2 ...] | 获取所有(一个或多个)给定 key 的值。 | |
setnx key value | 只有在 key 不存在时设置 key 的值。 | 并发锁 |
incr key | 将 key 中储存的数字值增一。 | 销量+1 |
incrby key increment | 将 key 所储存的值加上给定的增量值(increment) 。 | 增加指定值 |
DECR key | 将 key 中储存的数字值减一。 | 库存-1 |
DECRBY key decrement | key 所储存的值减去给定的减量值(decrement) 。 | 减少指定值 |
STRLEN key | 获取key的长度 | |
append key value | 拼接字符串 | |
1.2:hash(哈希)
是一个field-value的映射表,适合存储对象,存储长度是2^32-1,一共40亿对的键值对。
hash命令 | 说明 | 实战用法 |
HMSET hash1 field1 "zhangsan" field2 "beijing" field3 "22" | 存储hash1 | 常用设置对象 |
HDEL hash1 age | 删除指定的字段(age) | 常用获取对象指定属性 |
HEXISTS hash1 age | 判断hash1的age是否存在 | |
HGET hash1 name | 获取hash1的指定name字段 | |
HGETALL hash1 | 获取hash1的所有键值 | |
HMSET hash1 age "20" | 重新把hash1的age属性设置回来 | |
HINCRBY hash1 age 2 | 把hash1的age属性添加2 变成22 | |
HKEYS hash1 | 获取所有的key集合 | |
HLEN hash1 | 获取hash1的key的长度 返回整形3 | |
HVALS hash1 | 获取hash1的值的集合 | |
HSET hash1 age "99" | 修改hash1的属性 | |
1.3:list(列表,数据有序可以重复)
Redis列表是简单的字符串列表,数据可以重复,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 2^ 32 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
第5个添加元素 | 第4个添加元素 | 第3个添加元素 | 第2个添加元素 | 第1个添加元素 |
list命令 | 说明 | 实战用法 |
LPUSH key value | 在列表的头部添加元素 | list数据主要用在消息队列 |
LPOP key | 移除列表的左边第一元素 | |
LINDEX key index | 通过索引获取列表中的元素 | |
RPUSH key value | 在列表尾部添加元素 | |
RPOP key | 移除列表的右边第一元素 | 适合秒杀场景 从队列取数据 |
LLEN key | 获取列表长度 | |
LSET key index value | 通过索引设置元素的值 | |
LINDEX key index | 通过索引获取列表中的元素 | |
LTRIM key start stop | 对一个列表进行修剪,获取开始和结束区间的值 |
1.4:set(集合,数据无序,不能重读)
set命令 | 说明 | 实战用法 |
SADD set1 "22" "33" "44" | 向set1中添加元素22 33 44,数据不能重复 | set数据主要用来查重 |
SCARD set1 | 获取集合的成员数长度 | |
SMEMBERS set1 | 获取集合的所有成员 | |
SPOP set1 | 随机删除set1中的成员 | |
SDIFF set1 set2 | 差集 set1-set2 | |
SDIFF set1 set2 | 差集 set2-set1 | |
SINTER set2 set1 | 交集 | 相同的部分 |
SUNION set2 set1 | 并集 | 集合并集 |
SDIFFSTORE set3 set1 set2 | set3=set1-set2 | |
SINTERSTORE set3 set1 set2 | set3=set1和set2的交集 | |
SUNIONSTORE set3 set1 set2 | set3=set1+set2 |
1.5:zset(有序集合,数据有序,不能重复,但是分值可以一样)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
zset命令 | 说明 | 实战用法 |
ZADD zset1 4000 tom | 向zset中添加分值4000的tom | 用于热门数据 实时热度 |
ZCARD zset1 | 查询成员个数,返回整形 | |
ZCOUNT zset1 0 7000 | 查询成员分值区间个数,返回整形 | |
ZINCRBY zset1 1 "tom" ZREVRANGE zset1 0 3 WITHSCORES | tom的分值+100 返回其中成员的位置按分数值递减(从大到小)来排列 0-2 前四名 | 将tom的热度+1 用户更新热度前三的数据 |
1.6:HyperLogLog(2.8版本新增,用于做基数统计算法)
什么是基数?
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。
为什需要这个数据类型,以为hyperloglog可以存储2^32次方的数据,大约60亿个,但是这个键只会话费12KB的内存,算法空间也只需要12KB,计算的时候十分节省空间内存相较于传统的集合。
zset命令 | 说明 | 实战用法 |
PFADD usercount aa | 添加指定元素到 HyperLogLog 中 | 将每天,每月,每年的同一个用户访问量存储起来,大小只需要12KB 不需要使用set,那样数据量会很大 |
PFCOUNT usercount | 返回给定 HyperLogLog 的基数估算值。 | 计算每天,每月,每年的访问, |
2:数据类型总结
类型 | 简介 | 特性 | 场景 |
---|---|---|---|
String(字符串) | 二进制安全 | 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M | --- |
Hash(字典) | 键值对集合,即编程语言中的Map类型 | 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) | 存储、读取、修改用户属性 |
List(列表) | 链表(双向链表) | 增删快,提供了操作某一段元素的API | 1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列 |
Set(集合) | 哈希表实现,元素不重复 | 1、添加、删除,查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作 | 1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐 |
Sorted Set(有序集合) | 将Set中的元素增加一个权重参数score,元素按score有序排列 | 数据插入集合时,已经进行天然排序 | 1、排行榜 2、带权 |
3: redis事务
3.1:redis事务的定义(不保证要么都执行,要么回退)
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
1:批量操作在发送 EXEC 命令前被放入队列缓存。批量执行
2:收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
3:在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:
开始事务。(MULTI)
命令入队。(各种redis操作)
执行事务。(EXEC)
3.2:redis事务的用法
redis事务 | 说明 |
WATCH c | 监听c的值,如果c的值发生变化就回滚事务,否则提交 |
MULTI | 开始事务 |
set a 2 | 执行具体的操作a=2 |
set b 2 | 执行具体的操作c=2 |
EXEC | 提交事务 |
DISCARD | 回滚事务 |