文章目录
String(java的String)
常用命令
- SET
set key value:存入字符串键值对
- MSET
MSET key value [key value ...]:批量存储字符串键值对
- SETNX
SETNX key value:存入一个不存在的字符串键值对(返回1代表不存在存入成功,返回0代表存在此次存入失败,可用于分布式锁)
- GET
get key:获取一个字符串键值
- MGET
MGET key1 key2 key3:批量获取字符串键值
- DEL
del key:删除一个键
- EXPIRE
EXPIRE key seconds:设置一个键的过期时间(秒)
- INCR
INCR key:将key中储存的数字值加1 INCRBY key num:将key所储存的值加上num
- DECR
DECR key:将key中储存的数字值减1 DECRBY key num:将key所储存的值减去num
String常见应用场景
-
单值缓存
SET key value APPEND key value:向key后面追加value
-
对象缓存
- value是个json对象 set user:1 '{"name":"roy","balance":1888}' - key区分用户,value是单个值 MSET user:1:name roy user:1:balance 1888 (key是user:1:name和user:1:balance,value是roy和balance)
-
分布式锁
SETNX product:10001 true //返回1代表获取锁成功,返回0代表获取锁失败 。。。执行业务操作 DEL product:10001 //执行完业务释放锁 SET product:10001 true ex 10 nx //给锁设置过期时间,防止程序意外终止导致死锁
Hash(类似java的双层map)
个人感觉,可以理解为一个key中有多个KV(我个人理解为java中的Map<key,Map<key,value>>
)
常用命令
- HSET
hset key field1 v1 field v2:存储一个哈希表key的键值
- HMSET
HMSET key field value [field value ...]:在一个哈希表key中存储多个键值对
- HSETNX
HSETNX key field value:和SETNX命令一个作用
- HGET
HGET key field:获取哈希表key对应的field键值
- HMGET
HMGET key field [field ...]:批量获取哈希表key中多个field键值
- HDEL
HDEL key field [field ...]:删除哈希表key中的field键值
- HLEN
HLEN key:/返回哈希表key中field的数量
- HGETAL
HGETALL key:返回哈希表key中所有的键值
- HINCRBY
HINCRBY key field num:为哈希表key中field键的值加上增量num
Hash常见应用场景
- 对象缓存
HSET user 1:name zhangsan 1:balance 1888 HSET user 2:name lisi 2:balance 16000 HMGET user 1:name 1:balance
- 电商购物车(很久前有这样用的)
- 以用户id为key
- 商品id为field
- 商品数量为value
// 给用户id加个前缀cart hset cart:1001 10088 1 //添加商品 hincrby cart:1001 10088 1 //增加数量 hlen cart:1001 //商品总数 hdel cart:1001 10088 //删除商品 hgetall cart:1001 //获取购物车所有商品
Hash结构优缺点
- 优点
- 同类数据归类整合储存,方便数据管理
- 相比string操作消耗内存与cpu更小
- 相比string储存更节省空间
- 缺点
- 过期功能不能使用在field上,只能用在key上
- Redis集群架构下不适合大规模使用
注意:使用hash时,也要避免大key的出现
// 大key:一个key下面有太多数据
// 每个用户创建一个key(比较推荐,可以避免大key,key值user:id)
hset user:1 name zhangsan age 18 sex 1
hset user:2 name lisi age 20 sex 0
// 所有用户共用一个key,用field去区分(不推荐,会造成大key,key值user)
hset user 1:name zhangsan 1:age 18 1:sex 1
List(java的list集合)
常用命令
- LPUSH
LPUSH key value [value ...]:将一个或多个值value插入到key列表的表头(最左边)
- RPUSH
RPUSH key value [value ...]:将一个或多个值value插入到key列表的表尾(最右边)
- LPOP
LPOP key:移除并返回key列表的头元素
- RPOP
RPOP key:移除并返回key列表的尾元素
- LRANGE
LRANGE key start stop:返回列表key中指定区间内的元素(从start索引到stop索引)
- BLPOP … timeout
从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒 如果timeout=0,一直阻塞等待 BLPOP key [key ...] timeout
- BRPOP … timeout
从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒 如果timeout=0,一直阻塞等待 BRPOP key [key ...] timeout
List常见应用场景
- 常用数据结构
- Stack(栈) = LPUSH + LPOP (哪端放哪端出)
- Queue(队列)= LPUSH + RPOP (一端放另一端出)
- Blocking MQ(阻塞队列)= LPUSH + BRPOP (拿数据时一直等待超时)
- 常见应用场景
- 视频列表、签到列表
- 排队机
- 简化版的MQ
List注意点
- 一个list的容量是2的32次方减1个元素,
大概40多亿
。但是在应用时,要注意大key的 问题
。 - list的底层是一个双向链表,对双端的操作性能很高。但是通过索引下表直接
操作某一 个中间节点的性能就会比较低
Set(java的set集合)
常用命令
- SADD
SADD key member [member ...]:往集合key中存入元素,元素存在则忽略,若key不存在则新建
- SREM
SREM key member [member ...]:从集合key中删除元素
- SMEMBERS
SMEMBERS key:获取集合key中所有元素
- SCARD
SCARD key:获取集合key的元素个数
- SISMEMBER
SISMEMBER key member:判断member元素是否存在于集合key中(java的contains方法)
- SRANDMEMBER
SRANDMEMBER key [count]:从集合key中选出count个元素,元素不从key中删除
- SPOP
SPOP key [count]:从集合key中选出count个元素,元素从key中删除
集合命令
- SINTER
SINTER key1 key2 ...:key1、key2、keyN的交集运算
- SINTERSTORE
SINTERSTORE destination key1 key2 key3...:将交集结果存入新集合destination中
- SUNION
SUNION key1 key2 ...:key1、key2、keyN的并集运算
- SUNIONSTORE
SUNIONSTORE destination key1 key2 key3...:将并集结果存入新集合destination中
- SDIFF
SDIFF key1 key2 ...:key1、key2、keyN的差集运算
- SDIFFSTORE
SDIFFSTORE destination key1 key2 key3...:将差集结果存入新集合destination中
Set应用场景
- 微信抽奖小程序
1.点击参与抽奖加入集合 SADD key {userlD} 2.查看参与抽奖所有用户 SMEMBERS key 3.抽取count名中奖者 SRANDMEMBER key [count] / SPOP key [count]
- 微信微博点赞,收藏,标签
// key是like:{消息ID} 1.点赞 SADD like:{消息ID} {用户ID} 2.取消点赞 SREM like:{消息ID} {用户ID} 3.检查用户是否点过赞 SISMEMBER like:{消息ID} {用户ID} 4.获取点赞的用户列表 SMEMBERS like:{消息ID} 5.获取点赞用户数 SCARD like:{消息ID}
- 集合操作
SINTER set1 set2 set3 -> { c } 共同关注的人 SUNION set1 set2 set3 -> { a,b,c,d,e } 朋友圈的人 SDIFF set1 set2 set3 -> { a } 推荐好友
ZSet
zset 通常包含3个关键字操作:
- key (与我们 redis 通常操作的 key value 中的key 一致)
- score (排序的分数,该分数是有序集合的关键,可以是双精度或者是整数,
可以重复
) - member (指我们传入的 obj,与 key value 中的 value 一致)
常见命令
- ZADD
ZADD key score member [[score member]…]:往有序集合key中加入带分值元素
- ZREM
ZREM key member [member …]:从有序集合key中删除元素
- ZSCORE
ZSCORE key member:返回有序集合key中元素member的分值
- ZINCRBY
ZINCRBY key num member:为有序集合key中元素member的分值加上num
- ZCARD
ZCARD key:返回有序集合key中元素个数
- ZRANGE
ZRANGE key start stop [WITHSCORES]:正序获取有序集合key从start下标到stop下标的元素
- ZREVRANGE
ZREVRANGE key start stop [WITHSCORES]:倒序获取有序集合key从start下标到stop下标的元素
集合命令
```java
ZUNIONSTORE destkey numkeys key [key ...]:并集计算
ZINTERSTORE destkey numkeys key [key …]:交集计算
```
ZSet应用场景
- 排行榜
1.点击新闻
ZINCRBY hotNews:20190819 1 守护香港
2.展示当日排行前十
ZREVRANGE hotNews:20190819 0 9 WITHSCORES
3.七日搜索榜单计算
ZUNIONSTORE hotNews:20190813-20190819 7
hotNews:20190813 hotNews:20190814... hotNews:20190819
4.展示七日排行前十
ZREVRANGE hotNews:20190813-20190819 0 9 WITHSCORES
Bitmap类型
常见命令
-
SETBIT
SETBIT key offset value:将一个二进制数组的offset位置设置成value。value只能是0或者1
-
GETBIT
GETBIT key offset:返回一个二进制数组的offset位置的值
-
BITCOUNT
(注意BYTE|BIT)
1byte=8bitBITCOUNT key [start end [BYTE|BIT]]:返回二进制数组中1的个数 默认是byte参数,也就是一次读end - strat个字节位的数据,比如strat=1,end=7,那么就是统计(7-1)*8=56位数的1的个数 如果是要统计start--end位的1的个数,后面跟bit 比如strat=1,end=7(统计索引1-7的1的个数)
-
BITPOS
BITPOS key bit [start [end [BYTE|BIT]]]:返回bitmap中第一个值为bit的offset位置
-
BITOP
BITOP AND|OR|XOR|NOT destkey key1 key2:对两个bitmap做二进制的与或非计算
Bitmap应用场景
- 每日签到
SETBIT dailycheck:1 100 1 --1号用户第100天完成了签到 BITCOUNT dailycheck:1 --统计1号用户的签到次数 BITPOS dailycheck:1 --统计1号用户第一天签到的时间
- 优点
快速、高效、节省空间
Hyperloglog类型
作用介绍:用于统计一个集合中不重复的元素个数。典型应用场景例如根据用户访问记录统计网站的UV。
常用命令
- PFADD
PFADD key v1 v2 v3 ... :向key添加v1,v2,v3值
- PFCOUNT(set集合)
PFCOUNT key:统计key中不重复的元素个数 感觉这功能,set也能实现,既能去重又可以统计个数,那为什么还有这个类型呢? 是因为它用于大数据量的统计, 占用空间小却可以存海量数据
- PFMERGE
PFMERGE destkey [sourcekey [sourcekey ...]]:将多个hyperloglong数据整合成一条记录
Geo类型
基于地理空间的一种数据类型
常用命令
- GEOADD
将一个或多个经纬度坐标存储到位置集合中并对应设置名字,执行后返回新添加的坐标数量,若是更新member的位置坐标则返回0-- 添加一个或多个地点 longitude:经度 latitude:纬度 GEOADD key [NX|XX] [CH] longitude latitude member [longitude latitude member ...] 例如:GEOADD beijing 112.2 50.4 tiananmen shanghai 110.4 18.4 waitan -- XX选项的作用是只更新不添加,执行后返回0。 -- NX选项的作用是只添加不更新,执行成功返回添加元素的个数 -- CH选项的作用是返回被修改成员的数量而非添加成功的成员数量,被修改包括新添加。
- GEOPOS
GEOPOS key [member [member ...]]:返回地址的经纬度
- GEODIST
GEODIST key member1 member2 [M|KM|FT|MI]:计算两个地点之间的距离
GEORADIUS
以给定的经纬度为中心, 返回集合包含的位置元素当中, 与中心的距离不超过给定最大距离(radius)的所有位置元素GEORADIUS key longitude latitude radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key|STOREDIST key] -- WITHDIST选项可返回匹配位置与给定位置间距离,数组形式返回 -- WITHCOORD 选项可返回匹配位置坐标,数组形式返回。 -- ASC|DESC选项可指定返回结果排序方式,按照距离升序(ASC)或降序(DESC)排列返回,不指定时默认升序 -- COUNT count [ANY]选项指定返回的位置个数 -- m 表示单位为米。 -- km 表示单位为千米。 -- mi 表示单位为英里。 -- ft 表示单位为英尺。
- georadiusbymember
查找指定位置半径内(radius)的其他位置GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOREDIST key] -- WITHDIST选项可返回匹配位置与给定位置间距离,数组形式返回 -- WITHCOORD 选项可返回匹配位置坐标,数组形式返回。 -- ASC|DESC选项可指定返回结果排序方式,按照距离升序(ASC)或降序(DESC)排列返回,不指定时默认升序 -- COUNT count [ANY]选项指定返回的位置个数 -- m 表示单位为米。 -- km 表示单位为千米。 -- mi 表示单位为英里。 -- ft 表示单位为英尺。
Geo应用场景
- 查询距离
GEODIST changsha 火车站 橘子洲 M
- 查找某个位置半径内的的地点
GEORADIUSBYMEMBER changsha 火车站 2 KM withdist withcoord count 4 withhash
stream类型
作用介绍:Redis版的MQ – 阻塞队列 + pub/sub;了解即可,企业应用比较少
常用命令
XADD key [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT count]] *|id field value [field value ...]
//往对列的末尾发布一条消息
XDEL key id [id ...] // 删除队列中的一条消息
XLEN key //获取队列的长度
XRANGE key start end [COUNT count] //查询队列中的消息
应用示例
1.创建队列,并添加消息 *表示让系统自动生成ID
XADD mystream * name loulan name roy name admin
2.查看对列消息 - 对列开始 + 对列结尾
XRANGE mystream - +
3.创建消费者组 0 从队列头部开始消费。 $ 从队列尾部开始消费
XGROUP CREATE mystream groupA 0
4.消费消息 > 表示从第一条未被消费过的消息消费。也可以指定ID
XREADGROUP GROUP groupA consumer1 count 2 STREAMS mystream >
5.查看消费者组的消费进度
XPENDING mystream groupA
SpringBoot集成Redis
- pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- yml文件配置
spring:
data:
redis:
host: ip
port: 端口
password: 密码
...
- RestTemplate快速上手
// 记住一个对象:
@Resource
private RedisTemplate<String,Object> redisTemplate;
redisTemplate.opsForValue().xxx //string类型
redisTemplate.opsForSet().xxx //set类型
redisTemplate.opsForHash().xxx //hash类型
redisTemplate.opsForList().xxx //list类型
redisTemplate.opsForZset().xxx //Zset类型
redisTemplate.opsForGeo().xxx //Geo类型
redisTemplate.opsForHyperLogLog().xxx //hyperLogLog类型
redisTemplate.opsForStream().xxx //stream类型
redisTemplate.opsForValue().setBit() //bit类型
- RedisTemplate中文乱码问题
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer();
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
GenericToStringSerializer<String> genericToStringSerializer = new
GenericToStringSerializer<>(String.class);
//指定key和value的序列化方式
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setValueSerializer(genericToStringSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setHashValueSerializer(stringRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}