问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

使用spring-data-redis集群redis,

发布网友 发布时间:2022-04-11 14:01

我来回答

2个回答

懂视网 时间:2022-04-11 18:22

Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装。

一、安装redis服务

1、下载安装redis服务,安装完成后会自动启动redis服务

sudo apt-get install redis-server

2、下载完成后,我们可以通过命令检查redis服务进程

ps -aux|grep redis

结果如下图所示:

1.jpg

3、也可以检查Redis服务的状态

netstat -nlt|grep 6379

#结果如下:
# tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN

4、通过命令检查redis服务状态

sudo /etc/init.d/redis-server status
# 结果如下:redis-server is running

二、配置redis

# 编辑redis配置文件
sudo vim /etc/redis/redis.conf

# 在vim中设置redis访问密码
requirepass 123456

# 在vim中注释bind,设置允许远程访问,redis默认只允许本机访问
#bind 127.0.0.1

# 重启redis服务
sudo /etc/init.d/redis-server restart

# 客户端访问redis服务
sudo redis-cli

# 客户端登录并访问redis服务
sudo redis-cli -a youpassword

# 远程客户端登录并访问redis服务
sudo redis-cli -a youpassword -h 192.168.1.22

三、编写java代码

1、cache接口定义

public interface Cache {

 /**
 * 添加
 * @param key
 * @param value
 */
 void put(Object key, Object value);
 
 /**
 * 得到key的值
 * @param key
 * @return
 */
 Object get(Object key);

 /**
 * 移除key
 * @param key
 * @return
 */
 Object remove(Object key);

}

2、cache接口实现

import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisListCommands;
import org.springframework.data.redis.connection.RedisStringCommands;
import org.springframework.data.redis.connection.RedisZSetCommands;
import org.springframework.data.redis.connection.jedis.JedisConverters;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.data.redis.core.types.Expiration;
import org.springframework.data.redis.serializer.RedisSerializer;
import redis.clients.jedis.Jedis;

public class DefaultRedisCache implements Cache {

 private final static Logger logger = LoggerFactory.getLogger(DefaultRedisCache.class);

 private RedisTemplate redisTemplate;

 //秒
 private final static Long DEFAULT_EXPIRE = 12 * 60 * 60L;

 public DefaultRedisCache(RedisTemplate redisTemplate) {
 this.redisTemplate = redisTemplate;
 }

 @Override
 public void put(final Object key, final Object value) {
 put(key, value, DEFAULT_EXPIRE);
 }

 @Override
 public Object get(final Object key) {
 return redisTemplate.execute(new RedisCallback() {
  @Override
  public Object doInRedis(RedisConnection connection) throws DataAccessException {

  RedisSerializer<Object> serializer = getRedisSerializer();

  byte[] keyByte = serializer.serialize(key);
  if(keyByte == null){
   return null;
  }
  byte[] bytes = connection.get(keyByte);

  if (bytes == null) {
   return null;
  }

  return serializer.deserialize(bytes);
  }
 });
 }

 @Override
 public Object remove(final Object key) {
 return redisTemplate.execute(new RedisCallback() {
  @Override
  public Object doInRedis(RedisConnection connection) throws DataAccessException {

  RedisSerializer<Object> serializer = getRedisSerializer();

  if (key == null) {
   return null;
  }

  byte[] bytes = serializer.serialize(key);

  return connection.del(bytes);
  }
 });
 }

3、配置applicationContext-cache-test.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

 <context:property-placeholder location="classpath:redis-config.properties" ignore-unresolvable="true"/>

 <!-- jedis pool配置 -->
 <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
 <property name="maxTotal" value="${commons.cache.redis.maxTotal}" />
 <property name="maxIdle" value="${commons.cache.redis.maxIdle}" />
 <property name="maxWaitMillis" value="${commons.cache.redis.maxWait}" />
 <property name="testOnBorrow" value="${commons.cache.redis.testOnBorrow}" />
 <property name="testOnReturn" value="${commons.cache.redis.testOnReturn}" />
 </bean>

 <!-- spring data redis -->
 <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
 <property name="usePool" value="true"></property>
 <property name="hostName" value="${commons.cache.redis.host}" />
 <property name="port" value="${commons.cache.redis.port}" />
 <property name="password" value="${commons.cache.redis.password}" />
 <property name="timeout" value="${commons.cache.redis.timeout}" />
 <!--<property name="database" value="${commons.cache.redis.default.db}"></property>-->
 <property name="poolConfig" ref="jedisPoolConfig" />
 </bean>

 <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
 <property name="connectionFactory" ref="jedisConnectionFactory" />
 </bean>
 
 <!-- 自定义缓存工厂接口 -->
 <bean id="cacheFactory" class="com.xxx.cache.factory.CacheFactory" p:redisTemplate-ref="redisTemplate"/>
</beans>

4、配置redis-config.properties文件

# jedis pool配置
commons.cache.redis.maxTotal=1000
commons.cache.redis.maxIdle=600
commons.cache.redis.maxWait=1000
commons.cache.redis.testOnBorrow=true
commons.cache.redis.testOnReturn=true

# spring data redis 配置
commons.cache.redis.host=192.168.1.230
commons.cache.redis.port=6379
commons.cache.redis.password=123456
commons.cache.redis.timeout=1000

5、测试

@ContextConfiguration(locations = {
 "classpath:applicationContext-cache-test.xml"
})
@RunWith(SpringJUnit4ClassRunner.class)
public class CacheTest extends BaseTest{

 @Autowired
 private Cache cache;

 @Test
 public void redisTest() {

 // 添加key为username的值到redis缓存里
 cache.put("username","nathan");

 // 获取值
 Object username = cache.get("username");
 System.out.println("cache.get = " + username);

 // 删除值
// cache.remove("username");
// Object delResult = cache.get("username");
// System.out.println("cache.remove = " + delResult);
 }

}

更多redis知识请关注redis入门教程栏目。

热心网友 时间:2022-04-11 15:30

用的是什么集群方式,JedisSentinelPool 还是ShardedJedisPool。
如果用的是前者,配置是需要连接sentinel端口的(默认26379),不是连接redis端口(6379)。
或者把spring相关配置文件贴出来一下。

<!-- 分片式redis集群配置 -->
<bean id="jedisShardInfo1" class="redis.clients.jedis.JedisShardInfo">
<constructor-arg name="host" value="127.0.0.1" />
<constructor-arg name="port" value="6379 />
</bean>

<bean id="jedisShardInfo2" class="redis.clients.jedis.JedisShardInfo">
<constructor-arg name="host" value="127.0.0.1" />
<constructor-arg name="port" value="6380" />
</bean>

<bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">
<constructor-arg index="0" ref="jedisPoolConfig" />
<constructor-arg index="1">
<list>
<ref bean="jedisShardInfo1" />
<ref bean="jedisShardInfo2" />
</list>
</constructor-arg>
</bean>

<!-- 主从Redis + Sentinel集群缓存配置 -->
<bean id="jedisSentinelPool" class="redis.clients.jedis.JedisSentinelPool">
<constructor-arg index="0" value="mymaster" />
<constructor-arg index="1">
<set>
<value>127.0.0.1:26379</value>
<value>127.0.0.1:26380</value>
<value>127.0.0.1:26381</value>
</set>
</constructor-arg>
<constructor-arg index="2" ref="jedisPoolConfig" />
</bean>
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
重磅|8月1日起 报关单的填法将重大改变 进出口权需要报关员么 宝宝被莫名的虫子咬了又红又肿又痒怎么? 北京疫情个为数是什么意思? 在做刀伤的手术时没有接上神经是医院的过错吗? 手术室收费项目有哪些 手术室的秘密:一台10万的手术,主刀医生拿多少?答案颠覆你的认知 阿里巴巴中修改产品信息只修改一小部分行吗?谢谢 可否给我一个阿里巴巴的序列号~谢谢了 阿里巴巴店铺产品搜索框代码谁有呢,给我发一下谢谢了! spring data redis 集合怎么实现 关于一个网站限制IP登陆次数的解决办法,重赏。 Java web怎么限制同一个ip(或mac地址)访问网站,查询资源次数的? jedissentinelpool 会自动读写分离吗 redis读写瓶颈 Redis的需要读写分离吗 redis 读写分离 怎么控制 redis自带的集群为什么不用一致性哈希算法 如何查看redis主从是否一致 redis冷热分区,冷热交互是自动的还是手动的 redistemplate.expire为什么要设置失效时间 我配置了redis注解缓存,为什么不起作用 java怎么模拟redis缓存超时 redis 失效如何快速响应 集成部署对redis缓存失效有影响吗 redis 内存释放 线上Redis内存用爆了,怎么搞 什么是研究程序设计中计算机操作对象以及它们之间关系和运算的专门学科 小弟九月份考计算机二级vfp,帮忙!!! php下载redis扩展,redis不同版本扩展包里面的文件不一样 redis spring怎么整合 spring-data-redis支持redis集群吗 目前spring-data-redis到底支不支持redis集群的 配置了spring-data-redis 还需要配置jedis吗 redis 怎么查询全部 redis命名空间对查询有帮助吗 Redis高级-07-主从复制-主从结构搭建 关于redis的异步api,为什么很少有人用异步方式?没必要吗 java 怎么通过redistemplate去调接口 请问有没有好的方法遍历redis里面的所有key。。? 如何获取redis中String类型的全部key值 java 怎么遍历redis啊 redis 可以得到字符串开头的所所有key吗 php redis有没有办法获取所有redis列表 centos系统lnmp环境里面没有redis和memcahe,我是编译安装,php能够支持redis和memcache扩展? lnmp一键安装后运行正常,现在想装redis扩展,却发现php安装目录下压根没有ext目录,怎么办? 如何是php支持redis 是如何配置的? 是不是还需要扩展什么的 lnmp一键安装包怎么使用redis windows下php7.0.1安装哪个版本redis php 安装redis最低版本是多少