一 Jedis整合redis

1.启动redis

2.引入Jedis依赖

<!-- https://mvnrepository.com/artifact/redis.clients/jedis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.1.1</version></dependency>

maven引入jedis之后就可在代码中使用jedis对象了

3.Jedis类使用
在Jedis类中数据的操作方法基本上和命令是同名的,返回值类型也是一样的,我们直接调用就可以啦

import redis.clients.jedis.Jedis;import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class JedisTest {public static void main(String[] args) throws InterruptedException {//        新建Jedis类对象Jedis jedis = new Jedis("127.0.0.1", 6379);
//       测试Redis连接System.out.println("redis连接测试:" + jedis.ping());
//        判断某个键是否存在System.out.println("判断某个键是否存在:" + jedis.exists("mykey"));
//        获取所有的键Set<String> keys = jedis.keys("*");System.out.println(keys);//        根据key去删除键值对System.out.println("删除键" + jedis.del("mykey"));/*** String类型*/
//        设置一个键值对jedis.set("mykey1", "myValue1");jedis.set("mykey2", "myValue2");jedis.set("mykey3", "myValue3");
//        根据索引获取一个数据的值System.out.println("得到的数值为:" + jedis.get("mykey2"));System.out.println("获取多个键值对:" + jedis.mget("mykey1", "mykey2", "mykey3"));System.out.println("获取mykey1的数据的长度:" + jedis.strlen("mykey1"));System.out.println("返回key中字符串值的子串:" + jedis.getrange("mykey2", 1, 5));System.out.println("字符串追加:" + jedis.append("mykey3", "hello"));System.out.println("获取到mykey3的值:" + jedis.get("mykey3"));/*** Hash类型*/
//        设置一个Hash数据Map<String, String> valueMap = new HashMap<>();valueMap.put("name", "huixiaoyuan");valueMap.put("sex", "男");valueMap.put("age", "3");System.out.println("设置一个Hash数据" + jedis.hmset("myHash", valueMap));System.out.println("获取指定哈希表中所有的字段和值:" + jedis.hgetAll("myHash"));System.out.println("获取存储在哈希表中指定字段的值:" + jedis.hget("myHash", "name"));System.out.println("删除一个或多个哈希表字段:" + jedis.hdel("myHash", "sex"));System.out.println("获取哈希表中字段的数量:" + jedis.hlen("myHash"));/*** List类型*/System.out.println("将一个或多个元素插入列表表头:" + jedis.lpush("myList", "l1", "l2", "l3"));System.out.println("将一个或多个元素插入列表尾部:" + jedis.rpush("myList", "l4"));System.out.println("获取列表长度:" + jedis.llen("myList"));System.out.println("通过索引获取列表中的元素:" + jedis.lindex("myList", 2));System.out.println("移除并获取列表第一个元素:" + jedis.lpop("myList"));System.out.println("移除并获取列表最后一个元素:" + jedis.rpop("myList"));/*** Hash类型*/System.out.println("设置一个Hash数据" + jedis.hmset("myHash", valueMap));System.out.println("获取指定哈希表中所有的字段和值:" + jedis.hgetAll("myHash"));System.out.println("获取存储在哈希表中指定字段的值:" + jedis.hget("myHash", "name"));System.out.println("删除一个或多个哈希表字段:" + jedis.hdel("myHash", "sex"));System.out.println("获取哈希表中字段的数量:" + jedis.hlen("myHash"));/*** Set类型*/System.out.println("向集合中添加一个或多个成员:" + jedis.sadd("mySet","s1","s2","s3"));System.out.println("向集合中添加一个或多个成员:" + jedis.sadd("mySet2","s3","s4","s5"));System.out.println("获取集合中成员的个数:" + jedis.scard("mySet"));System.out.println("返回第一个集合与其他集合之间的差异:" + jedis.sdiff("mySet","mySet2"));System.out.println("返回集合中的所有元素:" + jedis.smembers("mySet"));/***ZSet类型*/System.out.println("向有序集合中添加一个或多个成员:" + jedis.zadd("myZset",1,"m1"));System.out.println("向有序集合中添加一个或多个成员:" + jedis.zadd("myZset",2,"m2"));System.out.println("向有序集合中添加一个或多个成员:" + jedis.zadd("myZset",3,"m3"));System.out.println("获取有序集合的成员数:" + jedis.zcard("myZset"));System.out.println("计算有序集合中指定区间分数的成员数:" + jedis.zcount("myZset",0,2));System.out.println("移除有序集合中的一个或多个元素:" + jedis.zrem("myZset","m2"));}
}

输出

com.msb.spring.redis.demo.JedisTest
redis连接测试:PONG
判断某个键是否存在:false
[myHash, mykey3, mykey2, mySet2, mykey1, mySet, myList, myZset]
删除键0
得到的数值为:myValue2
获取多个键值对:[myValue1, myValue2, myValue3]
获取mykey1的数据的长度:8
返回key中字符串值的子串:yValu
字符串追加:13
获取到mykey3的值:myValue3hello
设置一个Hash数据OK
获取指定哈希表中所有的字段和值:{name=huixiaoyuan, age=3, sex=男}
获取存储在哈希表中指定字段的值:huixiaoyuan
删除一个或多个哈希表字段:1
获取哈希表中字段的数量:2
将一个或多个元素插入列表表头:7
将一个或多个元素插入列表尾部:8
获取列表长度:8
通过索引获取列表中的元素:l1
移除并获取列表第一个元素:l3
移除并获取列表最后一个元素:l4
设置一个Hash数据OK
获取指定哈希表中所有的字段和值:{name=huixiaoyuan, age=3, sex=男}
获取存储在哈希表中指定字段的值:huixiaoyuan
删除一个或多个哈希表字段:1
获取哈希表中字段的数量:2
向集合中添加一个或多个成员:0
向集合中添加一个或多个成员:0
获取集合中成员的个数:3
返回第一个集合与其他集合之间的差异:[s1, s2]
返回集合中的所有元素:[s3, s1, s2]
向有序集合中添加一个或多个成员:0
向有序集合中添加一个或多个成员:1
向有序集合中添加一个或多个成员:0
获取有序集合的成员数:3
计算有序集合中指定区间分数的成员数:2
移除有序集合中的一个或多个元素:1Process finished with exit code 0

二 SpringBoot 整合redis

1.启动redis

2.引入redis依赖

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

3.application,yml
配置文件

##redis配置信息
spring:redis:database: 0 #redis数据库索引,默认为0host: 127.0.0.1 #redis服务器地址port: 6379 #redis服务器连接端口# password: #redis服务器连接密码,默认为nulltimeout: 5000 #redis连接超时时间
# ******** 如果不使用连接池,那么下面这部分可省略不写 ********jedis:pool: #连接池配置max-active: 8 #连接池最大连接数max-wait: -1 #连接池最大阻塞等待时间max-idle: 8 #连接池中的最大空闲连接数min-idle: 0 #连接池中的最小空闲连接数

配置完成之后可以使用RedisTemplate来操作redis

package com.spring.redis.demo;import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.TestComponent;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;@Component
class SpringbootredisApplicationTests {@Autowiredprivate StringRedisTemplate stringRedisTemplate;//@Autowired//private RedisTemplate redisTemplate;@Autowiredprivate RedisTemplate redisTemplate;/*** 使用redisTemplate操作*/public void redisTest07() {System.out.println("redisTemplate集成测试");redisTemplate.opsForValue().set("姓名","灰小猿");System.out.println("获取到的姓名:" + redisTemplate.opsForValue().get("姓名"));//        数据库操作RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
//        清空当前数据库
//        connection.flushDb();
//        清空所有数据库
//        connection.flushAll();}public void redisTest08() {User user = new User("灰小猿", 5);redisTemplate.opsForValue().set("user", user);System.out.println("获取到的数值:");System.out.println(redisTemplate.opsForValue().get("user"));}
}

运行该类

package com.msb.spring.redis.demo;import java.io.Serializable;public class User implements Serializable {private String name;private int age;public User() {}public User(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}
package com.msb.spring.redis.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {ConfigurableApplicationContext ctx = SpringApplication.run(DemoApplication.class, args);//TestRedis redis = ctx.getBean(TestRedis.class);//redis.testRedis();SpringbootredisApplicationTests springbootredisApplicationTests=ctx.getBean(SpringbootredisApplicationTests.class);//springbootredisApplicationTests.redisTest07();springbootredisApplicationTests.redisTest08();}
//
//{"name":"灰小猿","age":5}
}

输出

User{name='灰小猿', age=5}

我们可以看到现在Redis是以默认的JBK的方式进行序列化的。得到的结果如上。

但是现在的项目更多的是采用的前后端分离的方式进行的,数据的传输一般都是以JSON的形式,尤其是对象的传输,

原因是:JSON 语法格式简单、层次结构清晰、并且在数据交换方面,JSON 所使用的字符要比 XML 少得多,可以大大得节约传输数据所占用的带宽。

所以对于Redis中的数据,在实际开发中,我们一般也会将其存储为JSON的形式,这个时候就需要我们通过自定义redisTemplate的方式将Redis默认的序列化方式改为JSON的形式,

自定义RedisTemplate

自定义redisTemplate的方法是:新建一个配置类RedisConfig,在其中注入一个Bean,并实现自定义的序列化方法。

package com.msb.spring.redis.demo;import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class RedisConfig {@Bean("redisTemplate")public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {//      为了开发方便,一般都使用<String, Object>类型RedisTemplate<String, Object> template = new RedisTemplate();
//      连接工厂template.setConnectionFactory(factory);//        序列化配置FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
//        value值的序列化采用FastJsonRedisSerializertemplate.setValueSerializer(fastJsonRedisSerializer);
//        hash值的序列化采用FastJsonRedisSerializer的方式template.setHashValueSerializer(fastJsonRedisSerializer);//        key的序列化采用StringRedisSerializerStringRedisSerializer stringRedisSerializer = new StringRedisSerializer();template.setKeySerializer(stringRedisSerializer);
//        hash的key的序列化采用StringRedisSerializer的方式template.setHashKeySerializer(stringRedisSerializer);return template;}}

重新打印user

package com.msb.spring.redis.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {ConfigurableApplicationContext ctx = SpringApplication.run(DemoApplication.class, args);//TestRedis redis = ctx.getBean(TestRedis.class);//redis.testRedis();SpringbootredisApplicationTests springbootredisApplicationTests=ctx.getBean(SpringbootredisApplicationTests.class);//springbootredisApplicationTests.redisTest07();springbootredisApplicationTests.redisTest08();}
//User{name='灰小猿', age=5}
//{"name":"灰小猿","age":5}
}

{“name”:“灰小猿”,“age”:5}
json格式,可以发现明显与默认的存储方法不同,现在我们存储在Redis中的对象,就会自动以JSON的方式进行序列化并存储啦!

RedisTemplate和StringRedisTemplate有以下的区别:
StringRedisTemplate继承自RedisTemplate。
两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。
StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

那么应该在什么时候使用RedisTemplate,什么时候使用StringRedisTemplate呢?

当你的redis数据库里面本来存的就是字符串数据或者你要存取的数据就是字符串类型数据的时候,那么你就使用StringRedisTemplate即可。

但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,那么使用RedisTemplate是更好的选择。

除此之外两者在操作上都是一样的,StringRedisTemplate对应了操作五种数据类型的方法,而且操作和stringRedis一样,

stringRedisTemplate.opsForValue(); 对应String类型操作
stringRedisTemplate.opsForHash(); 对应Hash类型操作
stringRedisTemplate.opsForList(); 对应List类型操作
stringRedisTemplate.opsForSet(); 对应Set类型操作
stringRedisTemplate.opsForZSet(); 对应ZSet类型操作

Jedis适合在没有spring系列框架的普通Java工程中使用
RedisTemplate适合在多种数据类型的项目,且希望自动进行数据转换的情况下使用
StringRedisTemplate适合在只有字符串处理的情况下使用

redis-Java集成Redis相关推荐

  1. Java集成Redis key过期通知

    为什么要使用过期通知呢? 捕获Redis中过期的Key,解锁新姿势.比如有个用户会员的模块,那么可以在redis添加一个用户会员的有效时Key,然后在Java项目中捕获,处理相关的逻辑. 一.开启Re ...

  2. java集成redis集群_spring集成redis cluster详解

    客户端采用最新的jedis 2.7 1.maven依赖: redis.clients jedis 2.7.3 2.增加spring 配置 classpath:connect-redis.propert ...

  3. Redis——Java连接Redis

    Java连接redis,首先修改两项配置文件 bind 127.0.0.1 ::1 注释掉 protected-mode 设置为no 然后需要导入一个依赖 <!--redis--> < ...

  4. redis java 集成视频_redis(6)-java集成二

    使用Jedis框架: 创建maven工程,引入依赖 redis.clients jedis 2.9.0 Demo代码如下: import java.util.HashMap; import java. ...

  5. redis java excel_7.redis excel读写

    上周复习: 1.内置函数 len type max() sum() round(5.3212,2)#取几位小数 char() # ord() # sorted()#排序 reversed()#反向 r ...

  6. redis java客户端配置,Java的Redis客户端选择-jedis与Lettuce

    Lettuce 和 Jedis 的定位都是Redis的client,所以他们当然可以直接连接redis server. Jedis在实现上是直接连接的redis server,如果在多线程环境下是非线 ...

  7. 【JAVA秘籍功法篇-SpringBoot】SpringBoot如何集成Redis?

    SpringBoot如何集成redis 大家好,我是王老狮,一个有思想有内涵的架构狮.Redis作为分布式缓存,在我们的项目中经常会用到,今天我们看下SpringBoot如何集成redis. POM中 ...

  8. 在线实时大数据平台Storm集成redis开发(分布锁)

    1.需求场景:spout从ftp列表中拿到未读取的文件读取并发射行到Bolt,bolt进行业务处理后提交下一Bolt入库.用redis主要是:保存文件列表对象,使用分布锁来同步互斥访问共享对象,使文件 ...

  9. MyBatis-25MyBatis缓存配置【集成Redis】

    文章目录 概述 集成步骤 1.添加项目依赖 2. 配置redis 3. 修改PrivilegeMapper.xml中的缓存配置 其他缓存框架 概述 Redis是一个高性能的key-value数据库 M ...

  10. 函数集成redis与Spring集成

    新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正 redis与Spring集成比较简单,本文不触及Spring的一些基本概念,读都需先具有Spring的相干知识. 先在maven中添 ...

最新文章

  1. AngularJS实现原理
  2. 一到关于js函数的前端面试题引发的血案
  3. python hashlib 哈希算法
  4. 图像局部显著性—点特征(SIFT为例)
  5. java swing jbutton_Java 反射
  6. SpringCloud微服务2-服务提供者和消费者
  7. linux中info功能是什么意思,Linux中的info指令
  8. 火绒弹窗拦截_弹窗广告的克星:火绒安全软件图文使用教程
  9. ios charts显示固定个数_上次挂在了百度iOS二面不服气, 三月之期已到,这次终于拿下offer!...
  10. how tomcat works 读书笔记(一)----------一个简单的webserver
  11. Phoshop证件照换底色(红底换蓝底、白底)
  12. matlab纹理特征提取方法,基于共生矩阵纹理特征提取
  13. 老哥,Java 中 final 和 effectively final 到底有什么区别?
  14. 北方大学 ACM 多校训练赛 第四场 题解
  15. 《速度与激情》男主演保罗沃克车祸身亡,再见速度再见难续的激情
  16. Xubuntu22.04装有道词典:报错has unexpected type “float“(一百四十一)
  17. vpu测试_单独编译IMX6Q的VPU示例程序:mxc_vpu_test.out
  18. Realtek 2.5G PCIE网卡 RTL8125B-CG支持PXE免驱简介
  19. [差分 上下界最大流] SRM 694 div1 SRMDiv0Easy
  20. 价值 20 万美元的爱马仕包包是用蘑菇做的,你还会买吗?

热门文章

  1. Java新人之路 -- 集合(上)
  2. 【为生活开发系列之二】Android微信新版全自动抢红包助手
  3. 增肌粉和蛋白粉的区别
  4. ICCV 2021 最新200篇ICCV2021论文分方向汇总
  5. python模拟鼠标键盘点击,简单自动化动物餐厅
  6. AGC 自动增益控制
  7. java 体检套餐_第五章项目:体检套餐
  8. android应用推广高招齐分享!力荐六大安卓应用推广方式
  9. 黄金期货单位(黄金期货单位有哪些)
  10. Eboot之函数BootloaderMain函数分析