springboot整合redis之后,提供了操作redis的简便方式
通过通用对象redisTemplate方式操作String,Hash,List,Set SortSet五大数据类型
本案例中使用springboot连接Redis集群的方式操作,同时也提供了非集群了解配置。
1、redisTemplate.opsForValuey用法
2、redisTemplate.opsForHash用法
3、
重点说明1:
很多人redis集群已经配置成功了,并且可以正常使用,但是springboot工程无法连接。
情况1:linux系统没有开发端口,需要开放端口:centos7中设置端口放行(centos7防火墙配置端口放行)_centos7端口放行_雾林小妖的博客-CSDN博客
情况2:在redis.conf的配置中,bind的属性设置成bind 0.0.0.0,需要设置成bind 192.168.133.149
重点说明2:如果没有成功搭建redis集群请卡下面的连接:
redis集群配置连接:https://blog.csdn.net/tangshiyilang/article/details/129890028
引入:springboot2.7.9 +jdk1.8+ Redis6.2.5+jedis(集群连接工具)
【包依赖信息】
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.7.6
com.txc
springboot_redis
0.0.1-SNAPSHOT
springboot_redis
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter-data-redis
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
redis.clients
jedis
com.alibaba
fastjson
1.2.75
org.springframework.boot
spring-boot-maven-plugin
配置说明:主要做了数据库连接配置,redis连接配置
mybatis配置没有配置,全部使用默认配置
redis.host:写你自己的主机地址,linux中地址ip查看命令:ifconfig
【连接单击redis配置】
spring:
#redis配置
redis:
database: 0
host: 192.168.133.147
port: 6379
timeout: 5000
password: 123456
【连接redis集群配置】
spring:
redis:
cluster:
nodes:
- 192.168.133.149:9001
- 192.168.133.149:9002
- 192.168.133.149:9003
- 192.168.133.149:9004
- 192.168.133.149:9005
- 192.168.133.149:9006
max-redirects: 6 #节点数量
jedis:
pool:
max-active: 16 #最大的连接数
max-wait: 3000 #最大的等待时间
max-idle: 8 #最大空闲数
min-idle: 0 #最小空闲数
@Configuration
public class RedisConfig{
/*配置order,如果不配置添加数据,redis中的key和value乱码*/
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 创建一个json的序列化方式
GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// 设置value用jackjson进行处理
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// 设置key用string序列化方式
redisTemplate.setKeySerializer(new StringRedisSerializer());
// 设置hash的键
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
// 设置hash的value序列化
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
【操作结果】
【具体测试代码】
@Controller
public class TestController {
@Resource
private RedisTemplate redisTemplate;
//数据缓存值redis,String类型
@RequestMapping("/testString")
@ResponseBody
public void testString() throws Exception {
System.out.println("======132=========");
//创建操作字符串类型数据的对象
ValueOperations opsString=redisTemplate.opsForValue();
//使用1、添加一条key为username,值为shiyilang的String
opsString.set("username", "shiyilang");
//使用2、查询key为username的值
opsString.get("username");
//使用3:multiSet同时添加多个key和value
Map map=new HashMap();
map.put("a","123");
map.put("b","234");
opsString.multiSet(map);
//使用4:添加key:username,value:晓春qie数据有效期为30秒
opsString.set("username","xiaochun",3000,TimeUnit.SECONDS);
//使用6:getAndSet取值之后,重新赋值为大春
opsString.getAndSet("username","大春");
//使用7:为sex的值增加2
opsString.increment("sex",2);
//使用8:为sex的值增加减2
opsString.decrement("sex",3);
}
}
将一个对象以json字符串的形式存储在redis中,此时修改其中的一个字段,就必须将这个的json字符串重新转了一下,然后重新存储,势必会造成性能上的消耗。使用hash可以解决只修改一个值。
【测试结果】
【测试代码】
@Controller
public class TestController {
@Resource
private RedisTemplate redisTemplate;
//添加hash类型的参数及过期时间
@RequestMapping("/testHash")
@ResponseBody
public void testHash() {
HashOperations opsHash=redisTemplate.opsForHash();
//用法1:put->添加一条hash参数,key为id,value为1001
opsHash.put("stu1","id","1001");
Map map=new HashMap();
map.put("id","123");
map.put("name","晓春");
map.put("sex","1");
//用法2:putAll->:同时向stu1中添加多条数据
opsHash.putAll("stu1",map);
//用法3:get->获取stu1中key为name的值
opsHash.get("stu1","name");
//用法4:increment->为stu1中sex的值增加2
opsHash.increment("stu1","sex",2);
//用法5:delete->删除stu1中的name
opsHash.delete("stu1","name");
//用法6:获取stu1中所有的key和value
Map allKeyAndValue=opsHash.entries("stu1");
//用法7:multiGet->获取stu1中,id和name的值
List list=opsHash.multiGet("stu1",Arrays.asList("id","name"));
System.out.println(list);
//用法8:putIfAbsent->id存在就返回false且不执行任何动作,id不存在就添加id和value
boolean flag=opsHash.putIfAbsent("stu1","id","123");
System.out.println(flag);
//用法9:expire->设置stu1的有效为30秒
redisTemplate.expire("stu1",30000,TimeUnit.SECONDS);
//用法10:randomEntry->随机弹出stu1中的一个键值对,如name=晓春或sex=1
String key1=opsHash.randomEntry("stu1").toString();
//用法11:size->查询stu1中键值对的数量
opsHash.size("stu1");
}
}
list可以存储一个有序的字符串列表,常用的操作是向列表两端添加数据,或者获得列表的某个片段。
列表类型内部都是使用双向列表实现的,所有向列表两端添加元素的时间复杂度为0,获取越相近两端的的元素速度就越快,这就意味着即使是一个有几千万个元素的列表,获取头部或者尾部的记录都是非常快的。
【测试结果】
【测试代码】
@Controller
public class TestController {
@Resource
private RedisTemplate redisTemplate;
//redsiTemplate操作List类型数据
@RequestMapping("/testList")
@ResponseBody
public void testList() throws Exception {
ListOperations opsList=redisTemplate.opsForList();
//用法1:向列表list左边添加值1
opsList.leftPush("list","1");
//用法2:向列表list左边添加多个值
String []a={"3","4","5"};
opsList.leftPushAll("list",a);
//用法3:向列表list右边边添加值
opsList.rightPush("list","1");
//用法4:向列表list右边添加多个值
String []b={"7","8","9"};
opsList.rightPushAll("list",b);
//用法5:从集合的左边弹出三个数,并从结合中删除这三个元素,如:[5, 4, 3]
List
数据不重复且没有顺序
【测试结果】
【测试代码】
//redsiTemplate操作set类型数据
@RequestMapping("/testSet")
@ResponseBody
public void testSet() throws Exception {
SetOperations opsSet=redisTemplate.opsForSet();
//用法1:向test中添加三个参数
String []arr={"a","b","c"};
opsSet.add("test",arr);
//用法2:移出rest中的a值
String []arr1={"a"};
opsSet.remove("test",arr1);
//用法3:查询出test中的所有数据,并通过迭代器遍历数据
Set
sortedset和set类型极为类似,它们都是字符串的集合,都不允许重复的成员出现在一个set集合中。它们之间的主要差别是sortedset中的每一个成员都会有一个分数(score)与之关联,redis正是通过分数来为集合指那个的成员进行从大到小的排序。然而需要额外指出的是尽管sortedset中的成员必须是唯一的,但是分数却是可以重复的。
在sortedset中添加、删除或更新一个成员都是非常快速的操作。其时间复杂度为集合中成员数量的对数。由于sortedset中的成员在集合中的位置是有序的。因此,即便是访问位于集合中部的成员也仍然是非常高效的。
1、排名,网站流量统计,微博热点,分数的统计排行
2、游戏的积分排行榜,通过zadd更新玩家分数,然后通过zrange命令获取集合topten的用户信息
3、rted-set还可以用户构建索引数据
4、销售排行榜
【测试结果】
【测试代码】
@Controller
public class TestController {
@Resource
private RedisTemplate redisTemplate;
//redsiTemplate操作set类型数据
@RequestMapping("/testZSET")
@ResponseBody
public void testZSET(){
ZSetOperations opsZSET= redisTemplate.opsForZSet();
//用法1:向集合zset中添加值java,且分数score设置为1
opsZSET.add("zset","java",1);
//用法2:获取java的score
Double score1=opsZSET.score("zset","java");
//用法3:获取zset中成员的数量
long count=opsZSET.zCard("zset");
//用法4:删除zset集合中的java
String []arr={"java"};
opsZSET.remove("zset");
//按用法5:照范围删除,-1表示最后
opsZSET.removeRange("zset",0,-1);
//用法6:删除集合zset中score在20-30的所有数据
opsZSET.removeRangeByScore("zset",20,30);
//用法7:按照score从到小返回数据
Set sets=opsZSET.reverseRange("zset",0,-1);
Iterator ites= sets.iterator();
while(ites.hasNext()){
System.out.println(ites.next());
}
//用法8:返回集合zset中20-30的数据,且按照从低到高排序
opsZSET.rangeByScore("zset",20,30);
//用法9:为集合zset中java的score值增加5
opsZSET.incrementScore("zset","java",5);
//用法10:获取分数在20-30之间的成员
opsZSET.count("zset",20,30);
//用法11:按照从小到大规则,返回java在集合zset中的排名
opsZSET.rank("zset","java");
//用法12:按照从大到小规则,返回java在集合zset中的排名
opsZSET.reverseRank("zset","java");
}
}
@Controller
public class TestController {
@Resource
private RedisTemplate redisTemplate;
//redsiTemplate操作,通用命令
@RequestMapping("/testGe")
@ResponseBody
public void testGe() {
//用法1:获取指定的keyz值,如*,??list,keys*
redisTemplate.keys("");
//用法2:删除指定的key
redisTemplate.delete("");
//用法3:给key重命名
redisTemplate.rename("","");
//用法4:设置key的有效期
redisTemplate.expire("username",3000,TimeUnit.SECONDS);
//用法5:获取key的有效期
redisTemplate.getExpire("username",TimeUnit.SECONDS);
//用法6:清楚key的有效期
redisTemplate.persist("username");
//用法7:判断key的类型
redisTemplate.type("");
}
https://download.csdn.net/download/tangshiyilang/87665205