Redis学习基础

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 【1月更文挑战第6天】一、Redis介绍二、Redis各种常用命令1.Redis服务启动命令:2.Redis通用命令3.Redis字符串类型常用命令:4.Redis哈希操作命令5.Redis列表操作命令6.Redis集合操作命令7.Redis有序集合操作命令三、Redis在JAVA中的使用步骤1.Redis在JAVA中的配置2.Redis在JAVA中的具体使用1.字符串类型的使用2.哈希类型的使用3.列表类型的使用4.集合类型的使用5.有序集合类型的使用

文章目录

一、Redis介绍

二、Redis各种常用命令

1.Redis服务启动命令:

2.Redis通用命令

3.Redis字符串类型常用命令:

4.Redis哈希操作命令

5.Redis列表操作命令

6.Redis集合操作命令

7.Redis有序集合操作命令

三、Redis在JAVA中的使用步骤

1.Redis在JAVA中的配置

2.Redis在JAVA中的具体使用

1.字符串类型的使用

2.哈希类型的使用

3.列表类型的使用

4.集合类型的使用

5.有序集合类型的使用


一、Redis介绍

Redis诞生于2009年全称是Remote Dictionary Server,远程词典服务器,是一个基于内存的键值型NoSQL数据库。

特征:

  • 键值(key-value)型,value支持多种不同数据结构,功能丰富
  • 单线程,每个命令具备原子性
  • 低延迟,速度快(基于内存、IO多路复用、良好的编码)。
  • 支持数据持久化
  • 支持主从集群、分片集群
  • 支持多语言客户端

二、Redis各种常用命令

1.Redis服务启动命令:

  • redis-server.exe redis.windows.conf

2.Redis通用命令

通用指令是部分数据类型的,都可以使用的指令,常见的有:

  • KEYS:查看符合模板的所有key
  • DEL:删除一个指定的key
  • EXISTS:判断key是否存在
  • EXPIRE:给一个key设置有效期,有效期到期时该key会被自动删除
  • TTL:查看一个KEY的剩余有效期

3.Redis字符串类型常用命令:

  • SET key value:设置指定key的值
  • GET key:获取指定key的值
  • SETEX key seconds value:设置指定key的值,并将key的过期时间设为seconds秒
  • SETNX key value:只有在key不存在时设置key的值
  • MSET:批量添加多个String类型的键值对
  • MGET:根据多个key获取多个String类型的value
  • INCR:让一个整型的key自增1
  • INCRBY:让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2
  • INCRBYFLOAT:让一个浮点类型的数字自增并指定步长

4.Redis哈希操作命令

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象,常用命令:

  • HSET key field value:将哈希表key中的字段field的值设为value
  • HGET key field:获取存储在哈希表中指定字段的值
  • HDEL key field:删除存储在哈希表中的指定字段
  • HKEYS key:获取哈希表中所有字段
  • HVALS key:获取哈希表中所有值
  • HMSET:批量添加多个hash类型key的field的值
  • HMGET:批量获取多个hash类型key的field的值
  • HGETALL:获取一个hash类型的key中的所有的field和value
  • HINCRBY:让一个hash类型key的字段值自增并指定步长
  • HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行

5.Redis列表操作命令

Redis列表是简单的字符串列表,按照插入顺序排序,常用命令:

  • LPUSH key value1 [value2]:将一个或多个值插入到列表头部
  • LRANGE key start stop:获取列表指定范围内的元素
  • RPOP key:移除并获取列表最后一个元素(删除的同时会在控制台返回删除的值)
  • LLEN key:获取列表长度
  • LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil
  • RPUSH key element … :向列表右侧插入一个或多个元素
  • BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil

6.Redis集合操作命令

Redis set 是string类型的无序集合。集合成员是唯一的,集合中不能出现重复的数据,常用命令:

  • SADD key member1 [member2]:向集合添加一个或多个成员(添加多个时是无序的)
  • SMEMBERS key:返回集合中的所有成员
  • SCARD key:获取集合的成员数
  • SINTER key1 [key2]:返回给定所有集合的交集
  • SUNION key1 [key2]:返回所有给定集合的并集
  • SDIFF key1 key2 … :求key1与key2的差集
  • SREM key member1 [member2]:删除集合中一个或多个成员
  • SISMEMBER key member:判断一个元素是否存在于set中

7.Redis有序集合操作命令

Redis有序集合是string类型元素的集合,且不允许有重复成员。每个元素都会关联一个double类型的分数,常用命令:

  • ZADD key score1 member1 [score2 member2]:向有序集合添加一个或多个成员(默认按照score的大小从大到小排序(升序排列))
  • ZRANGE key start stop [WITHSCORES]:通过索引区间返回有序集合中指定区间内的成员
  • ZINCRBY key increment member:有序集合中对指定成员的分数加上增量increment
  • ZREM key member [member…]:移除有序集合中的一个或多个成员
  • ZSCORE key member : 获取sorted set中的指定元素的score值
  • ZCARD key:获取sorted set中的元素个数
  • ZCOUNT key min max:统计score值在给定范围内的所有元素的个数
  • ZRANK key member:获取sorted set 中的指定元素的排名
  • ZRANGEBYSCORE key min max:按照score排序后,获取指定score范围内的元素
  • ZDIFF、ZINTER、ZUNION:求差集、交集、并集
    注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可

三、Redis在JAVA中的使用步骤

Redis 在java中一般使用Spring Data Redis

1.Redis在JAVA中的配置

配置pom文件

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

配置redis参数

application.yml

redis:
    host: ${sky.redis.host}
    port: ${sky.redis.port}
    password: ${sky.redis.password}
    database: ${sky.redis.database}

application-dev.yml

redis:
    host: localhost
    port: 6379
    password: <--!你的redis数据库密码-->    database: 10<--!总共有16个库0-15,可以选择你要使用的某一个,默认是0-->

配置类:RedisConfiguration.java

importlombok.extern.slf4j.Slf4j;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.data.redis.connection.RedisConnectionFactory;
importorg.springframework.data.redis.core.RedisTemplate;
importorg.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration@Slf4jpublicclassRedisConfiguration {
@BeanpublicRedisTemplateredisTemplate(RedisConnectionFactoryredisConnectionFactory){
log.info("开始创建redis模板对象...");
RedisTemplateredisTemplate=newRedisTemplate();
//设置redis的连接工厂对象redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置redis key的序列化器redisTemplate.setKeySerializer(newStringRedisSerializer());
returnredisTemplate;
    }
}

2.Redis在JAVA中的具体使用

下面的五个参数分别对应Redis存储的五种数据类型:

packagecom.sky.test;
importorg.junit.jupiter.api.Test;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.boot.test.context.SpringBootTest;
importorg.springframework.data.redis.core.*;
@SpringBootTestpublicclassSpringDataRedisTest {
@AutowiredprivateRedisTemplateredisTemplate;
@TestpublicvoidtestRedisTemplate(){
System.out.println(redisTemplate);
ValueOperationsvalueOperations=redisTemplate.opsForValue();
HashOperationshashOperations=redisTemplate.opsForHash();
ListOperationslistOperations=redisTemplate.opsForList();
SetOperationssetOperations=redisTemplate.opsForSet();
ZSetOperationszSetOperations=redisTemplate.opsForZSet();
    }
}

1.字符串类型的使用

判断是否有key所对应的值,有则返回true,没有则返回falseredisTemplate.hasKey(key)
有则取出key值所对应的值redisTemplate.opsForValue().get(key)
删除单个key值redisTemplate.delete(key)
批量删除keyredisTemplate.delete(keys) //其中keys:Collection<K> keys将当前传入的key值序列化为byte[]类型redisTemplate.dump(key)
设置过期时间publicBooleanexpire(Stringkey, longtimeout, TimeUnitunit) {
returnredisTemplate.expire(key, timeout, unit);
 }
publicBooleanexpireAt(Stringkey, Datedate) {
returnredisTemplate.expireAt(key, date);
  }
查找匹配的key值,返回一个Set集合类型publicSet<String>getPatternKey(Stringpattern) {
returnredisTemplate.keys(pattern);
}
修改redis中key的名称publicvoidrenameKey(StringoldKey, StringnewKey) {
redisTemplate.rename(oldKey, newKey);
}
返回传入key所存储的值的类型publicDataTypegetKeyType(Stringkey) {
returnredisTemplate.type(key);
}
如果旧值存在时,将旧值改为新值publicBooleanrenameOldKeyIfAbsent(StringoldKey, StringnewKey) {
returnredisTemplate.renameIfAbsent(oldKey, newKey);
}
从redis中随机取出一个keyredisTemplate.randomKey()
返回当前key所对应的剩余过期时间publicLonggetExpire(Stringkey) {
returnredisTemplate.getExpire(key);
}
返回剩余过期时间并且指定时间单位publicLonggetExpire(Stringkey, TimeUnitunit) {
returnredisTemplate.getExpire(key, unit);
}
将key持久化保存publicBooleanpersistKey(Stringkey) {
returnredisTemplate.persist(key);
}
将当前数据库的key移动到指定redis中数据库当中publicBooleanmoveToDbIndex(Stringkey, intdbIndex) {
returnredisTemplate.move(key, dbIndex);
}
设置当前的key以及value值redisTemplate.opsForValue().set(key, value)
设置当前的key以及value值并且设置过期时间redisTemplate.opsForValue().set(key, value, timeout, unit)
返回key中字符串的子字符publicStringgetCharacterRange(Stringkey, longstart, longend) {
returnredisTemplate.opsForValue().get(key, start, end);
}
将旧的key设置为value,并且返回旧的keypublicStringsetKeyAsValue(Stringkey, Stringvalue) {
returnredisTemplate.opsForValue().getAndSet(key, value);
}
批量获取值publicList<String>multiGet(Collection<String>keys) {
returnredisTemplate.opsForValue().multiGet(keys);
 }
在原有的值基础上新增字符串到末尾redisTemplate.opsForValue().append(key, value)
以增量的方式将double值存储在变量中publicDoubleincrByDouble(Stringkey, doubleincrement) {
returnredisTemplate.opsForValue().increment(key, increment);
 }
通过increment(Kkey, longdelta)方法以增量方式存储long值(正值则自增,负值则自减)publicLongincrBy(Stringkey, longincrement) {
returnredisTemplate.opsForValue().increment(key, increment);
}
如果对应的map集合名称不存在,则添加否则不做修改MapvalueMap=newHashMap();  
valueMap.put("valueMap1","map1");  
valueMap.put("valueMap2","map2");  
valueMap.put("valueMap3","map3");  
redisTemplate.opsForValue().multiSetIfAbsent(valueMap); 
设置map集合到redisMapvalueMap=newHashMap();  
valueMap.put("valueMap1","map1");  
valueMap.put("valueMap2","map2");  
valueMap.put("valueMap3","map3");  
redisTemplate.opsForValue().multiSet(valueMap);  
获取字符串的长度redisTemplate.opsForValue().size(key)
value参数覆写给定key所储存的字符串值,从偏移量offset开始redisTemplate.opsForValue().set(key, value, offset)
重新设置key对应的值,如果存在返回false,否则返回trueredisTemplate.opsForValue().setIfAbsent(key, value)
将值value关联到key,并将key的过期时间设为timeoutredisTemplate.opsForValue().set(key, value, timeout, unit)
将二进制第offset位值变为valueredisTemplate.opsForValue().setBit(key, offset, value)
对key所储存的字符串值,获取指定偏移量上的位(bit)
redisTemplate.opsForValue().getBit(key, offset)

2.哈希类型的使用

获取变量中的指定map键是否有值,如果存在该map键则获取值,没有则返回null。redisTemplate.opsForHash().get(key, field)
获取变量中的键值对publicMap<Object, Object>hGetAll(Stringkey) {
returnredisTemplate.opsForHash().entries(key);
}
新增hashMap值redisTemplate.opsForHash().put(key, hashKey, value)
以map集合的形式添加键值对publicvoidhPutAll(Stringkey, Map<String, String>maps) {
redisTemplate.opsForHash().putAll(key, maps);
}
仅当hashKey不存在时才设置publicBooleanhashPutIfAbsent(Stringkey, StringhashKey, Stringvalue) {
returnredisTemplate.opsForHash().putIfAbsent(key, hashKey, value);
}
删除一个或者多个hash表字段publicLonghashDelete(Stringkey, Object... fields) {
returnredisTemplate.opsForHash().delete(key, fields);
}
查看hash表中指定字段是否存在publicbooleanhashExists(Stringkey, Stringfield) {
returnredisTemplate.opsForHash().hasKey(key, field);
}
给哈希表key中的指定字段的整数值加上增量incrementpublicLonghashIncrBy(Stringkey, Objectfield, longincrement) {
returnredisTemplate.opsForHash().increment(key, field, increment);
}
publicDoublehIncrByDouble(Stringkey, Objectfield, doubledelta) {
returnredisTemplate.opsForHash().increment(key, field, delta);
}
获取所有hash表中字段redisTemplate.opsForHash().keys(key)
获取hash表中字段的数量redisTemplate.opsForHash().size(key)
获取hash表中存在的所有的值publicList<Object>hValues(Stringkey) {
returnredisTemplate.opsForHash().values(key);
}
匹配获取键值对,ScanOptions.NONE为获取全部键对publicCursor<Entry<Object, Object>>hashScan(Stringkey, ScanOptionsoptions) {
returnredisTemplate.opsForHash().scan(key, options);
}

3.列表类型的使用

通过索引获取列表中的元素redisTemplate.opsForList().index(key, index)
获取列表指定范围内的元素(start开始位置, 0是开始位置,end结束位置, -1返回所有)
redisTemplate.opsForList().range(key, start, end)
存储在list的头部,即添加一个就把它放在最前面的索引处redisTemplate.opsForList().leftPush(key, value)
把多个值存入List中(value可以是多个值,也可以是一个Collectionvalue)
redisTemplate.opsForList().leftPushAll(key, value)
List存在的时候再加入redisTemplate.opsForList().leftPushIfPresent(key, value)
如果pivot处值存在则在pivot前面添加redisTemplate.opsForList().leftPush(key, pivot, value)
按照先进先出的顺序来添加(value可以是多个值,或者是Collectionvar2)
redisTemplate.opsForList().rightPush(key, value)
redisTemplate.opsForList().rightPushAll(key, value)
在pivot元素的右边添加值redisTemplate.opsForList().rightPush(key, pivot, value)
设置指定索引处元素的值redisTemplate.opsForList().set(key, index, value)
移除并获取列表中第一个元素(如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止)
redisTemplate.opsForList().leftPop(key)
redisTemplate.opsForList().leftPop(key, timeout, unit)
移除并获取列表最后一个元素redisTemplate.opsForList().rightPop(key)
redisTemplate.opsForList().rightPop(key, timeout, unit)
从一个队列的右边弹出一个元素并将这个元素放入另一个指定队列的最左边redisTemplate.opsForList().rightPopAndLeftPush(sourceKey, destinationKey)
redisTemplate.opsForList().rightPopAndLeftPush(sourceKey, destinationKey, timeout, unit)
删除集合中值等于value的元素(index=0, 删除所有值等于value的元素; index>0, 从头部开始删除第一个值等于value的元素; index<0, 从尾部开始删除第一个值等于value的元素)
redisTemplate.opsForList().remove(key, index, value)
将List列表进行剪裁redisTemplate.opsForList().trim(key, start, end)
获取当前key的List列表长度redisTemplate.opsForList().size(key)

4.集合类型的使用

添加元素redisTemplate.opsForSet().add(key, values)
移除元素(单个值、多个值)
redisTemplate.opsForSet().remove(key, values)
删除并且返回一个随机的元素redisTemplate.opsForSet().pop(key)
获取集合的大小redisTemplate.opsForSet().size(key)
判断集合是否包含valueredisTemplate.opsForSet().isMember(key, value)
获取两个集合的交集(key对应的无序集合与otherKey对应的无序集合求交集)
redisTemplate.opsForSet().intersect(key, otherKey)
获取多个集合的交集(Collectionvar2)
redisTemplate.opsForSet().intersect(key, otherKeys)
key集合与otherKey集合的交集存储到destKey集合中(其中otherKey可以为单个值或者集合)
redisTemplate.opsForSet().intersectAndStore(key, otherKey, destKey)
key集合与多个集合的交集存储到destKey无序集合中redisTemplate.opsForSet().intersectAndStore(key, otherKeys, destKey)
获取两个或者多个集合的并集(otherKeys可以为单个值或者是集合)
redisTemplate.opsForSet().union(key, otherKeys)
key集合与otherKey集合的并集存储到destKey中(otherKeys可以为单个值或者是集合)
redisTemplate.opsForSet().unionAndStore(key, otherKey, destKey)
获取两个或者多个集合的差集(otherKeys可以为单个值或者是集合)
redisTemplate.opsForSet().difference(key, otherKeys)
差集存储到destKey中(otherKeys可以为单个值或者集合)
redisTemplate.opsForSet().differenceAndStore(key, otherKey, destKey)
随机获取集合中的一个元素redisTemplate.opsForSet().randomMember(key)
获取集合中的所有元素redisTemplate.opsForSet().members(key)
随机获取集合中count个元素redisTemplate.opsForSet().randomMembers(key, count)
获取多个key无序集合中的元素(去重),count表示个数redisTemplate.opsForSet().distinctRandomMembers(key, count)
遍历set类似于Interator(ScanOptions.NONE为显示所有的)
redisTemplate.opsForSet().scan(key, options)

5.有序集合类型的使用

添加元素(有序集合是按照元素的score值由小到大进行排列)
redisTemplate.opsForZSet().add(key, value, score)
删除对应的value,value可以为多个值redisTemplate.opsForZSet().remove(key, values)
增加元素的score值,并返回增加后的值redisTemplate.opsForZSet().incrementScore(key, value, delta)
返回元素在集合的排名,有序集合是按照元素的score值由小到大排列redisTemplate.opsForZSet().rank(key, value)
返回元素在集合的排名,按元素的score值由大到小排列redisTemplate.opsForZSet().reverseRank(key, value)
获取集合中给定区间的元素(start开始位置,end结束位置, -1查询所有)
redisTemplate.opsForZSet().reverseRangeWithScores(key, start,end)
按照Score值查询集合中的元素,结果从小到大排序redisTemplate.opsForZSet().reverseRangeByScore(key, min, max)
redisTemplate.opsForZSet().reverseRangeByScoreWithScores(key, min, max)
//返回值为:Set<ZSetOperations.TypedTuple<V>>从高到低的排序集中获取分数在最小和最大值之间的元素redisTemplate.opsForZSet().reverseRangeByScore(key, min, max, start, end)
根据score值获取集合元素数量redisTemplate.opsForZSet().count(key, min, max)
获取集合的大小redisTemplate.opsForZSet().size(key)
redisTemplate.opsForZSet().zCard(key)
获取集合中key、value元素对应的score值redisTemplate.opsForZSet().score(key, value)
移除指定索引位置处的成员redisTemplate.opsForZSet().removeRange(key, start, end)
移除指定score范围的集合成员redisTemplate.opsForZSet().removeRangeByScore(key, min, max)
获取key和otherKey的并集并存储在destKey中(其中otherKeys可以为单个字符串或者字符串集合)redisTemplate.opsForZSet().unionAndStore(key, otherKey, destKey)
获取key和otherKey的交集并存储在destKey中(其中otherKeys可以为单个字符串或者字符串集合)redisTemplate.opsForZSet().intersectAndStore(key, otherKey, destKey)
遍历集合(和iterator一模一样)Cursor<TypedTuple<Object>>scan=opsForZSet.scan("test3", ScanOptions.NONE);
while (scan.hasNext()){
ZSetOperations.TypedTuple<Object>item=scan.next();
System.out.println(item.getValue() +":"+item.getScore());
}
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
存储 NoSQL Redis
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
Redis系列学习文章分享---第十六篇(Redis原理1篇--Redis数据结构-动态字符串,insert,Dict,ZipList,QuickList,SkipList,RedisObject)
85 1
|
2月前
|
NoSQL 数据可视化 Linux
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
本文介绍了Redis的两个可视化管理工具:付费的Redis Desktop Manager和免费的Another Redis DeskTop Manager,包括它们的下载、安装和使用方法,以及在使用Another Redis DeskTop Manager连接Redis时可能遇到的问题和解决方案。
148 1
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
|
2月前
|
NoSQL Linux Redis
Docker学习二(Centos):Docker安装并运行redis(成功运行)
这篇文章介绍了在CentOS系统上使用Docker安装并运行Redis数据库的详细步骤,包括拉取Redis镜像、创建挂载目录、下载配置文件、修改配置以及使用Docker命令运行Redis容器,并检查运行状态和使用Navicat连接Redis。
330 3
|
6月前
|
NoSQL Java Redis
Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)
Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)
87 0
|
6月前
|
存储 消息中间件 缓存
Redis系列学习文章分享---第十七篇(Redis原理篇--数据结构,网络模型)
Redis系列学习文章分享---第十七篇(Redis原理篇--数据结构,网络模型)
101 0
|
6月前
|
存储 NoSQL 算法
Redis系列学习文章分享---第十篇(Redis快速入门之附近商铺+用户签到+UV统计)
Redis系列学习文章分享---第十篇(Redis快速入门之附近商铺+用户签到+UV统计)
46 0
|
6月前
|
存储 NoSQL Redis
Redis系列学习文章分享---第九篇(Redis快速入门之好友关注--关注和取关 -共同关注 -Feed流实现方案分析 -推送到粉丝收件箱 -滚动分页查询)
Redis系列学习文章分享---第九篇(Redis快速入门之好友关注--关注和取关 -共同关注 -Feed流实现方案分析 -推送到粉丝收件箱 -滚动分页查询)
72 0
|
6月前
|
消息中间件 负载均衡 NoSQL
Redis系列学习文章分享---第七篇(Redis快速入门之消息队列--List实现消息队列 Pubsub实现消息队列 stream的单消费模式 stream的消费者组模式 基于stream消息队列)
Redis系列学习文章分享---第七篇(Redis快速入门之消息队列--List实现消息队列 Pubsub实现消息队列 stream的单消费模式 stream的消费者组模式 基于stream消息队列)
77 0
|
6月前
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
246 0
|
2月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
39 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。