Redis数据类型

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=8bit

    BITCOUNT 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-71的个数)
    
  • 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值