普通模式整合

一、在pom.xml中引入redis的依赖

<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.8.0.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>

二、新建redis.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
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-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- Redis连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxWaitMillis" value="${redis.maxWait}"/>
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="minIdle" value="${redis.minIdle}" />
<property name="maxTotal" value="${redis.maxTotal}" />
<property name="testOnBorrow" value="true" />
</bean> <bean id="jedisShardInfo" class="redis.clients.jedis.JedisShardInfo">
<constructor-arg index="0" value="${redis.host}" />
<constructor-arg index="1" value="${redis.port}" type="int" />
<!--如果redis没有设置密码,就不需要这个-->
<property name="password" value="${redis.password}" />
</bean> <!-- Redis连接 -->
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:shardInfo-ref="jedisShardInfo"
p:poolConfig-ref="jedisPoolConfig" /> <!-- 缓存序列化方式 -->
<!-- 如果不配置Serializer,那么存储的时候只能使用String,如果用对象类型存储,那么会提示错误 can't cast to String!!!-->
<bean id="keySerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" />
<bean id="valueSerializer" class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />
<bean id="hashKeySerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
<bean id="hashValueSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"
p:connectionFactory-ref="jedisConnectionFactory"
p:keySerializer-ref="keySerializer"
p:valueSerializer-ref="valueSerializer"
p:enableTransactionSupport="false"
p:hashKeySerializer-ref="hashKeySerializer"
p:hashValueSerializer-ref="hashValueSerializer"/>
</beans>

三、在spring的配置文件中引入redis.xml

<import resource="classpath*:spring/redis.xml" />

四、编写dao层

public abstract class RedisGeneratorDao<K extends Serializable, V extends Serializable> {

    @Autowired
protected RedisTemplate<K, V> redisTemplate; public void setRedisTemplate(RedisTemplate<K, V> redisTemplate) {
this.redisTemplate = redisTemplate;
} /**
* 获取 RedisSerializer
*/
protected RedisSerializer<String> getRedisSerializer() {
return redisTemplate.getStringSerializer();
} }
public interface MemberDao {
public boolean add(final Member member); public boolean add(final List<Member> list); public void delete(String key); public void delete(List<String> keys); public boolean update(final Member member); public Member get(final String keyId); public void deleteStr(String key);
}
import org.burning.sport.redis.model.Member;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.stereotype.Repository;
import org.springframework.util.Assert; import java.util.ArrayList;
import java.util.List; @Repository("memberDao")
public class MemberDaoImpl extends RedisGeneratorDao<String, Member> implements MemberDao { /**
* 添加对象
* @param member
* @return
*/
@Override
public boolean add(final Member member) {
Boolean result = redisTemplate.execute(new RedisCallback<Boolean>() { @Override
public Boolean doInRedis(RedisConnection redisConnection) throws DataAccessException {
RedisSerializer<String> serializer = getRedisSerializer();
byte[] key = serializer.serialize(member.getId());
byte[] name = serializer.serialize(member.getNickname());
return redisConnection.setNX(key, name);
}
});
return result;
} /**
* 添加集合
* @param list
* @return
*/
@Override
public boolean add(final List<Member> list) {
Assert.notEmpty(list);
Boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
@Override
public Boolean doInRedis(RedisConnection redisConnection) throws DataAccessException {
RedisSerializer<String> serializer = getRedisSerializer();
for(Member member : list) {
byte[] key = serializer.serialize(member.getId());
byte[] name = serializer.serialize(member.getNickname());
return redisConnection.setNX(key, name);
} return true;
}
}, false, true);
return false;
} /**
* 删除对象 ,依赖key
* @param key
*/
@Override
public void delete(String key) {
List<String> list = new ArrayList<String>();
list.add(key);
delete(list);
} /**
* 删除字符串
* @param key
*/
@Override
public void deleteStr(String key) {
redisTemplate.delete(key);
} /**
* 删除集合 ,依赖key集合
* @param keys
*/
@Override
public void delete(List<String> keys) {
redisTemplate.delete(keys);
} /**
* 修改对象
* @param member
* @return
*/
@Override
public boolean update(final Member member) {
String key = member.getId();
if(get(key) == null) {
throw new NullPointerException("数据行不存在, key = " + key);
} Boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
@Override
public Boolean doInRedis(RedisConnection redisConnection) throws DataAccessException {
RedisSerializer<String> serializer = getRedisSerializer();
byte[] key = serializer.serialize(member.getId());
byte[] value = serializer.serialize(member.getNickname());
redisConnection.setNX(key, value);
return true;
}
});
return result;
} /**
* 根据key获取对象
* @param keyId
* @return
*/
@Override
public Member get(final String keyId) {
Member result = redisTemplate.execute(new RedisCallback<Member>() {
@Override
public Member doInRedis(RedisConnection redisConnection) throws DataAccessException {
RedisSerializer<String> serializer = getRedisSerializer();
byte[] key = serializer.serialize(keyId);
byte[] value = redisConnection.get(key);
if(value == null) {
return null;
} String nickName = serializer.deserialize(value);
return new Member(keyId, nickName);
}
}); return result;
}
}

五、编写service层

public interface MemberService {
/**
* 添加对象
*/
public boolean add(final Member member); /**
* 添加集合
*/
public boolean add(final List<Member> list);
/**
* 删除对象 ,依赖key
*/
public void delete(String key); /**
* 删除字符串,依赖key
* @param key
*/
public void deleteStr(String key);
/**
* 删除集合 ,依赖key集合
*/
public void delete(List<String> keys); /**
* 修改对象
*/
public boolean update(final Member member);
/**
* 根据key获取对象
*/
public Member get(final String keyId); }
@Service("memberService")
public class MemberServicefImpl implements MemberService { @Autowired
private MemberDao memberDao; @Override
public boolean add(Member member) {
return memberDao.add(member);
} @Override
public boolean add(List<Member> list) {
return memberDao.add(list);
} @Override
public void delete(String key) {
memberDao.delete(key);
} @Override
public void deleteStr(String key) {
memberDao.deleteStr(key);
} @Override
public void delete(List<String> keys) {
memberDao.delete(keys);
} @Override
public boolean update(Member member) {
return memberDao.update(member);
} @Override
public Member get(String keyId) {
return memberDao.get(keyId);
}
}

六、写测试类进行测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:applicationContext.xml"})
public class RedisTest { @Autowired
private MemberService memberService; @Test
public void redisAddMember() {
Member member = new Member();
member.setId("1");
member.setNickname("ls"); memberService.add(member);
} @Test
public void redisDeleteStr() {
memberService.deleteStr("1");
} }

哨兵模式(sentinel)

就一个配置文件独特一点 redis-sentinel.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
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-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!--redis 哨兵模式(sentinel) 配置-->
<bean id="redisSentinelConfiguration" class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
<property name="master">
<bean class="org.springframework.data.redis.connection.RedisNode">
<property name="name" value="mymaster" />
</bean>
</property>
<property name="sentinels">
<set>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-arg index="0" value="10.6.1**.**6" /><!--ip-->
<constructor-arg index="1" value="9980" /><!--port-->
</bean>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-arg index="0" value="10.6.1**.**4" /><!--ip-->
<constructor-arg index="1" value="9980" /><!--port-->
</bean>
</set>
</property>
</bean> <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<constructor-arg ref="redisSentinelConfiguration"/>
</bean> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" value="jedisConnectionFactory" />
</bean>
</beans>

https://gitee.com/play-happy/base-project

Redis跟Spring整合,sentinel模式的更多相关文章

  1. Redis和Spring整合

    Redis和Spring整合 Redis在这篇里就不做介绍了~以后系统的学学,然后整理写出来. 首先是环境的搭建 通过自己引包的方式,将redis和spring-redis的包引到自己的项目中,我项目 ...

  2. redis与spring整合实例

    1)首先是redis的配置. 使用的是maven工程,引入redis与spring整合的相关jar包 <!-- redis服务 start--> <dependency> &l ...

  3. 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)

    本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...

  4. 分布式缓存技术redis系列(五)——redis实战(redis与spring整合,分布式锁实现)

    本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...

  5. redis系列之5----redis实战(redis与spring整合,分布式锁实现)

    本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...

  6. redis 与 spring整合 hash 增删改操作 list增删改操作

    本人,对于以前redis的学习是非常痛苦的!近期将以前的东西捡起来.以博客的形式存储,以便于以后快速捡起来,并和广大同胞一起分享! 1):简单介绍 redis 是基于C语言开发. redis是一个ke ...

  7. Redis + Jedis + Spring整合遇到的异常(转)

    项目中需要用到缓存,经过比较后,选择了redis,客户端使用jedis连接,也使用到了spring提供的spring-data-redis.配置正确后启动tomcat,发现如下异常: Caused b ...

  8. redis和spring整合使用

    第一步,在项目中加入redis的pom代码: <dependency> <groupId>redis.clients</groupId> <artifactI ...

  9. redis与spring整合·

    单机版: 配置spring配置文件applicationContext.xml <?xml version="1.0" encoding="UTF-8"? ...

随机推荐

  1. PyCharm/WebStorm遇到Cannot start internal HTTP server

    在开始学习html.css的时候,使用PyCharm 的模拟链接到服务器的时候总是遇到 网上也没有遇到合适的解决方案,遂下载了WebStorm,希望能通过安装配置好一些设置,结果依然不行,只有从头分析 ...

  2. vue-父子组件嵌套的示例

    组件注册: // 注册组件 Vue.component('my-component', { template: '<div>A custom component!</div>' ...

  3. 用 Identity Server 4 (JWKS 端点和 RS256 算法) 来保护 Python web api

    目前正在使用asp.net core 2.0 (主要是web api)做一个项目, 其中一部分功能需要使用js客户端调用python的pandas, 所以需要建立一个python 的 rest api ...

  4. 【数论】洛谷P1414又是毕业季II

    题目背景 "叮铃铃铃",随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在毕业 ...

  5. vs2008中xlslib与libxls库的编译及使用

    C++用来操作Excel的方法很多,但是涉及到跨平台,同时又要对Excel的读写操作兼顾,而且免费的库,那应该是要用xlslib和libxls了.由于技术比较菜,折腾这个折腾了一个星期了.最开始是使用 ...

  6. 5分钟了解MySQL5.7的undo log在线收缩新特性

    Part1:写在最前 在MysQL5.6版本中,可以把undo log 回滚日志分离到一个单独的表空间里:其缺点是不能回收空间大小,until MysQL5.7,but MariadDB10.1暂不支 ...

  7. 【ASP.NET MVC系列】数据验证和注解

    [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作篇)(下) [04]浅谈ASP. ...

  8. ES6小点心第二弹——底部浮现弹窗

    小点心,顾名思义,开箱即食,拿来即用. 献上第二个小点心:SlidePopup. GitHub 在线演示 GitHub 上欢迎大家来找茬^_^ 前端朋友们,今天要介绍的这款小点心牛B了.相信是个前端都 ...

  9. pycharm中进行带参数的调试

    之前基本都是用print进行调试的,但今天程序运行完需要等很长时间,就尝试pycharm调试. 但是在运行程序需要传递参数,之前只会点击bug按钮直接运行程序,不知道调试的时候传入参数. 运行---& ...

  10. vue.js之路由

    Vue.js本身只提供数据与视图绑定及组件化等功能,如果想用它来开发一个完整的SPA(单页面应用),我们就还需要使用一些Vue.js的插件.今天我学习一种叫做Vue-router的插件,用来提供路由管 ...