NoSQL之Redis(五)--- Redis测试以及其与spring的集成
2023-09-14 09:01:02 时间
// 创建一个jedis的对象。
Jedisjedis= newJedis("192.168.21.225", 6379);
// 调用jedis对象的方法,方法名称和redis的命令一致。
jedis.set("key1", "jedis test");
Stringstring= jedis.get("key1");
System.out.println(string);
// 关闭jedis。每次用完之后都应该关闭jedis
jedis.close();
}
JedisPoolpool= newJedisPool("192.168.21.225", 6379); // 从连接池中获得Jedis对象 Jedisjedis= pool.getResource(); Stringstring= jedis.get("key1"); System.out.println(string); // 关闭jedis对象 jedis.close(); pool.close(); }
public void testJedisCluster() { HashSet HostAndPort nodes= newHashSet (); nodes.add(new HostAndPort("192.168.21.225",7001)); nodes.add(new HostAndPort("192.168.21.225",7002)); nodes.add(new HostAndPort("192.168.21.225",7003)); nodes.add(new HostAndPort("192.168.21.225",7004)); nodes.add(new HostAndPort("192.168.21.225",7005)); nodes.add(new HostAndPort("192.168.21.225",7006)); JedisClustercluster= newJedisCluster(nodes); cluster.set("key1", "1000"); Stringstring= cluster.get("key1"); System.out.println(string); cluster.close(); }
property name="maxIdle" value="10" / !-- 每次释放连接的最大数目 -- property name="numTestsPerEvictionRun" value="1024" / !-- 释放连接的扫描间隔(毫秒) -- property name="timeBetweenEvictionRunsMillis" value="30000" / !-- 连接最小空闲时间 -- property name="minEvictableIdleTimeMillis" value="1800000" / !-- 连接空闲多久后释放, 当空闲时间 该值 且 空闲连接 最大空闲连接数 时直接释放 -- property name="softMinEvictableIdleTimeMillis" value="10000" / !-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -- property name="maxWaitMillis" value="1500" / !-- 在获取连接的时候检查有效性, 默认false -- property name="testOnBorrow" value="true" / !-- 在空闲时检查有效性, 默认false -- property name="testWhileIdle" value="true" / !-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -- property name="blockWhenExhausted" value="false" / /bean
bean id="redisClient" constructor-arg name="host" value="192.168.21.225" /constructor-arg constructor-arg name="port" value="6379" /constructor-arg constructor-arg name="poolConfig" ref="jedisPoolConfig" /constructor-arg bean id="jedisClient" / /bean
bean constructor-arg name="host" value="192.168.21.225" /constructor-arg constructor-arg name="port" value="7001" /constructor-arg /bean bean constructor-arg name="host" value="192.168.21.225" /constructor-arg constructor-arg name="port" value="7002" /constructor-arg /bean bean constructor-arg name="host" value="192.168.21.225" /constructor-arg constructor-arg name="port" value="7003" /constructor-arg /bean bean constructor-arg name="host" value="192.168.21.225" /constructor-arg constructor-arg name="port" value="7004" /constructor-arg /bean bean constructor-arg name="host" value="192.168.21.225" /constructor-arg constructor-arg name="port" value="7005" /constructor-arg /bean bean constructor-arg name="host" value="192.168.21.225" /constructor-arg constructor-arg name="port" value="7006" /constructor-arg /bean /set /constructor-arg constructor-arg name="poolConfig" ref="jedisPoolConfig" /constructor-arg /bean bean id="jedisClientCluster" /bean
public String set(String key, String value) { Jedisjedis= jedisPool.getResource(); Stringstring= jedis.set(key, value); jedis.close(); return string; } @Override public String hget(String hkey, String key) { Jedisjedis= jedisPool.getResource(); Stringstring= jedis.hget(hkey, key); jedis.close(); return string; } @Override public long hset(String hkey, String key, String value) { Jedisjedis= jedisPool.getResource(); Longresult= jedis.hset(hkey, key, value); jedis.close(); return result; } @Override public long incr(String key) { Jedisjedis= jedisPool.getResource(); Longresult= jedis.incr(key); jedis.close(); return result; } @Override public long expire(String key, int second) { Jedisjedis= jedisPool.getResource(); Longresult= jedis.expire(key, second); jedis.close(); return result; } @Override public long ttl(String key) { Jedisjedis= jedisPool.getResource(); Longresult= jedis.ttl(key); jedis.close(); return result; } @Override public long del(String key) { Jedis jedis = jedisPool.getResource(); Longresult= jedis.del(key); jedis.close(); return result; } @Override public long hdel(String hkey, String key) { Jedisjedis= jedisPool.getResource(); Longresult= jedis.hdel(hkey, key); jedis.close(); return result; }
public String set(String key, String value) { return jedisCluster.set(key, value); } @Override public String hget(String hkey, String key) { return jedisCluster.hget(hkey, key); } @Override public long hset(String hkey, String key, String value) { return jedisCluster.hset(hkey, key, value); } @Override public long incr(String key) { return jedisCluster.incr(key); } @Override public long expire(String key, int second) { return jedisCluster.expire(key, second); } @Override public long ttl(String key) { return jedisCluster.ttl(key); } @Override public long del(String key) { return jedisCluster.del(key); } @Override public long hdel(String hkey, String key) { return jedisCluster.hdel(hkey, key); }
public void testSpringJedisSingle(){ ApplicationContextapplicationContext = newClassPathXmlApplicationContext( "classpath:spring/applicationContext-*.xml"); JedisPoolpool= (JedisPool) applicationContext.getBean("redisClient"); Jedisjedis= pool.getResource(); Stringstring= jedis.get("key1"); System.out.println(string); jedis.close(); pool.close(); }
public voidtestSpringJedisCluster() { ApplicationContextapplicationContext = newClassPathXmlApplicationContext( "classpath:spring/applicationContext-*.xml"); JedisClusterjedisCluster= (JedisCluster) applicationContext .getBean("redisClient"); Stringstring= jedisCluster.get("key1"); System.out.println(string); jedisCluster.close(); }
利用Java来访问Redis并对Redis进行相关操作以及spring+redis集成配置与注解式注解 redis缓存的一些注意事项 只应将热数据放到缓存中 所有缓存信息都应设置过期时间 缓存过期时间应当分散以避免集中过期 缓存key应具备可读性 应避免不同业务出现同名缓存key 可对key进行适当的缩写以节省内存空间 选择合适的数据结构 确保写入缓存中的数据是完整且正确的 避免使用耗时较长的操作命令,如:keys * Redis默认配置中操作耗时超过10ms即视为慢查询 一个key对应的数据不应过大 对于string类型,一个key对应的value大小应控制在10K以内,1K左右更优hash类型,不应超过5000行
太厉害!Redis+Nginx+设计模式+Spring全家桶+Dubbo技术精选合集 最近花了很长的时间去搜罗Java核心技术好文,我把每个Java核心技术的优选文章都整理成了一个又一个的文档。昨天也是终于全部整理好了,今天就把这些东西分享给老铁们,也能为老铁们省去不少麻烦,想学什么技能了,遇到哪方面的问题了 直接打开文档学一学就好了。不多bb了,直接上干货!
Spring boot整合Redis(入门教程) jedis:采用直连,多个线程操作的话,是不安全的。如果想要避免不安全的,使用jedis pool连接池!更像BIO模式 lettuce:采用netty,实例可以在多个线程中进行共享,不存在线程不安全的情况,可以减少线程数据,更像NIO模式
Spring boot整合Redis实现发布订阅(超详细) Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收信息。微信,微博,关注系统 Redis客户端可以订阅任意数量的频道
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载
测试结果入下:
在实际的运用过程中,我们基本上不会这样每连接一次redis就去创建一个Jedis对象,而是会在程序加载的时候直接创建一个连接池。测试方法如下
JedisPoolpool= newJedisPool("192.168.21.225", 6379); // 从连接池中获得Jedis对象 Jedisjedis= pool.getResource(); Stringstring= jedis.get("key1"); System.out.println(string); // 关闭jedis对象 jedis.close(); pool.close(); }
public void testJedisCluster() { HashSet HostAndPort nodes= newHashSet (); nodes.add(new HostAndPort("192.168.21.225",7001)); nodes.add(new HostAndPort("192.168.21.225",7002)); nodes.add(new HostAndPort("192.168.21.225",7003)); nodes.add(new HostAndPort("192.168.21.225",7004)); nodes.add(new HostAndPort("192.168.21.225",7005)); nodes.add(new HostAndPort("192.168.21.225",7006)); JedisClustercluster= newJedisCluster(nodes); cluster.set("key1", "1000"); Stringstring= cluster.get("key1"); System.out.println(string); cluster.close(); }
测试结果入下:
通过上面的测试一方面我们知道了如何简单的去操作redis,另一方面也验证在之前介绍的redis的按照是没有问题的。
与Spring的集成
下面我们看看在spring的配置文件中如何配置redis的参数和Jedis相关的东西。
首先我们看看redis连接池的配置
property name="maxIdle" value="10" / !-- 每次释放连接的最大数目 -- property name="numTestsPerEvictionRun" value="1024" / !-- 释放连接的扫描间隔(毫秒) -- property name="timeBetweenEvictionRunsMillis" value="30000" / !-- 连接最小空闲时间 -- property name="minEvictableIdleTimeMillis" value="1800000" / !-- 连接空闲多久后释放, 当空闲时间 该值 且 空闲连接 最大空闲连接数 时直接释放 -- property name="softMinEvictableIdleTimeMillis" value="10000" / !-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -- property name="maxWaitMillis" value="1500" / !-- 在获取连接的时候检查有效性, 默认false -- property name="testOnBorrow" value="true" / !-- 在空闲时检查有效性, 默认false -- property name="testWhileIdle" value="true" / !-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -- property name="blockWhenExhausted" value="false" / /bean
bean id="redisClient" constructor-arg name="host" value="192.168.21.225" /constructor-arg constructor-arg name="port" value="6379" /constructor-arg constructor-arg name="poolConfig" ref="jedisPoolConfig" /constructor-arg bean id="jedisClient" / /bean
bean constructor-arg name="host" value="192.168.21.225" /constructor-arg constructor-arg name="port" value="7001" /constructor-arg /bean bean constructor-arg name="host" value="192.168.21.225" /constructor-arg constructor-arg name="port" value="7002" /constructor-arg /bean bean constructor-arg name="host" value="192.168.21.225" /constructor-arg constructor-arg name="port" value="7003" /constructor-arg /bean bean constructor-arg name="host" value="192.168.21.225" /constructor-arg constructor-arg name="port" value="7004" /constructor-arg /bean bean constructor-arg name="host" value="192.168.21.225" /constructor-arg constructor-arg name="port" value="7005" /constructor-arg /bean bean constructor-arg name="host" value="192.168.21.225" /constructor-arg constructor-arg name="port" value="7006" /constructor-arg /bean /set /constructor-arg constructor-arg name="poolConfig" ref="jedisPoolConfig" /constructor-arg /bean bean id="jedisClientCluster" /bean
为了方便笔者直接调用Jedis去操作redis,所以笔者写了一个JedisClient工具类,如下
由于对单机和集群的redis操作时不一样的,所以实现工具类的时候单机和集群的实现方式是不一样的。
public String set(String key, String value) { Jedisjedis= jedisPool.getResource(); Stringstring= jedis.set(key, value); jedis.close(); return string; } @Override public String hget(String hkey, String key) { Jedisjedis= jedisPool.getResource(); Stringstring= jedis.hget(hkey, key); jedis.close(); return string; } @Override public long hset(String hkey, String key, String value) { Jedisjedis= jedisPool.getResource(); Longresult= jedis.hset(hkey, key, value); jedis.close(); return result; } @Override public long incr(String key) { Jedisjedis= jedisPool.getResource(); Longresult= jedis.incr(key); jedis.close(); return result; } @Override public long expire(String key, int second) { Jedisjedis= jedisPool.getResource(); Longresult= jedis.expire(key, second); jedis.close(); return result; } @Override public long ttl(String key) { Jedisjedis= jedisPool.getResource(); Longresult= jedis.ttl(key); jedis.close(); return result; } @Override public long del(String key) { Jedis jedis = jedisPool.getResource(); Longresult= jedis.del(key); jedis.close(); return result; } @Override public long hdel(String hkey, String key) { Jedisjedis= jedisPool.getResource(); Longresult= jedis.hdel(hkey, key); jedis.close(); return result; }
public String set(String key, String value) { return jedisCluster.set(key, value); } @Override public String hget(String hkey, String key) { return jedisCluster.hget(hkey, key); } @Override public long hset(String hkey, String key, String value) { return jedisCluster.hset(hkey, key, value); } @Override public long incr(String key) { return jedisCluster.incr(key); } @Override public long expire(String key, int second) { return jedisCluster.expire(key, second); } @Override public long ttl(String key) { return jedisCluster.ttl(key); } @Override public long del(String key) { return jedisCluster.del(key); } @Override public long hdel(String hkey, String key) { return jedisCluster.hdel(hkey, key); }
public void testSpringJedisSingle(){ ApplicationContextapplicationContext = newClassPathXmlApplicationContext( "classpath:spring/applicationContext-*.xml"); JedisPoolpool= (JedisPool) applicationContext.getBean("redisClient"); Jedisjedis= pool.getResource(); Stringstring= jedis.get("key1"); System.out.println(string); jedis.close(); pool.close(); }
public voidtestSpringJedisCluster() { ApplicationContextapplicationContext = newClassPathXmlApplicationContext( "classpath:spring/applicationContext-*.xml"); JedisClusterjedisCluster= (JedisCluster) applicationContext .getBean("redisClient"); Stringstring= jedisCluster.get("key1"); System.out.println(string); jedisCluster.close(); }
至此,本文的的写作目的——测试集群,以及redis配置与Spring集成就达到了。其实在笔者在写本文的时候,一方面是对之前项目中redis运用的优化,另一方面在实际的其实本文在实现JedisClient的时候,所有的方法中在笔者的项目中是添加有日志的。至于为什么添加日志本文就不介绍了。
利用Java来访问Redis并对Redis进行相关操作以及spring+redis集成配置与注解式注解 redis缓存的一些注意事项 只应将热数据放到缓存中 所有缓存信息都应设置过期时间 缓存过期时间应当分散以避免集中过期 缓存key应具备可读性 应避免不同业务出现同名缓存key 可对key进行适当的缩写以节省内存空间 选择合适的数据结构 确保写入缓存中的数据是完整且正确的 避免使用耗时较长的操作命令,如:keys * Redis默认配置中操作耗时超过10ms即视为慢查询 一个key对应的数据不应过大 对于string类型,一个key对应的value大小应控制在10K以内,1K左右更优hash类型,不应超过5000行
太厉害!Redis+Nginx+设计模式+Spring全家桶+Dubbo技术精选合集 最近花了很长的时间去搜罗Java核心技术好文,我把每个Java核心技术的优选文章都整理成了一个又一个的文档。昨天也是终于全部整理好了,今天就把这些东西分享给老铁们,也能为老铁们省去不少麻烦,想学什么技能了,遇到哪方面的问题了 直接打开文档学一学就好了。不多bb了,直接上干货!
Spring boot整合Redis(入门教程) jedis:采用直连,多个线程操作的话,是不安全的。如果想要避免不安全的,使用jedis pool连接池!更像BIO模式 lettuce:采用netty,实例可以在多个线程中进行共享,不存在线程不安全的情况,可以减少线程数据,更像NIO模式
Spring boot整合Redis实现发布订阅(超详细) Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收信息。微信,微博,关注系统 Redis客户端可以订阅任意数量的频道
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载
相关文章
- Redis数据结构&命令手册
- SpringBoot之整合Redis分析和实现-基于Spring Boot2.0.2版本
- redis安装
- spring boot: 用redis的消息订阅功能更新应用内的caffeine本地缓存(spring boot 2.3.2)
- 如何设置redis中hash的field的expire ?
- Spring Data - Redis 节选自《Netkiller Java 手札》
- 一步一个脚印:解密唯品会中Redis集群架构演进与功能定制
- redis和mongodb
- Redis+Spring缓存实例(windows环境,附实例源码及详解)
- thinkphp6: 用redis+lua做限流(php 8.1.1 / thinkphp v6.0.10LTS )
- spring boot单元测试之十:用embedded-redis库做Redis的mock(spring boot 2.4.3)
- spring boot:用redis+redisson实现分布式锁(redisson3.11.1/spring boot 2.2)
- Spring Boot with Redis
- Red Hat系统安装Redis
- [转]reids客户端 redis-cli用法
- junit与spring-data-redis 版本对应成功的
- 深入理解Spring Redis的使用 (三)、使用RedisTemplate的操作类访问Redis
- 【最全详细配置】SpringBoot整合Redis
- 〖Python 数据库开发实战 - Python与Redis交互篇①〗- redis-py的安装与使用
- 分布式服务 API 的幂等设计方案 & Spring Boot + Redis 拦截器实现实例
- 【架构师修炼之路】Redis 极简教程 : 基本数据结构, 跳表原理, Spring Boot 项目使用实例...
- redis配置和常用方法
- Redis集群方案及实现
- Redis集群架构【转载】
- redis_09 _ 切片集群:数据增多了,是该加内存还是加实例
- Flink消费Kafka数据并把实时计算的结果导入到Redis
- 监控服务器配置(五)-----Redis_exporter安装配置
- 【redis源码学习】从源码角度看主从复制(3):全量同步 && 部分同步