Jedis & spring-data-redis
当我们了解了redis的五大数据类型,手动去敲一敲每个数据类型对应的命令,无论是再来看jedis,还是spring-data-redis都是很轻松的,他们提供的API都是基于原生的redis命令,可读性很强
jedis操作五大数据类型
其实关于怎么使用jedis的对应的五大数据类型的api,就不说太多了,因为可读性真的是太强了,只要了解那么底层的命令,开箱即用,忘记了,点一下,全出来了
demo:
/**
* @Author: Changwu
* @Date: 2019/3/28 11:45
*/
public class TextAPI {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.43.150", 6379);
jedis.hset("user","userName","25");
jedis.hset("user","id","1");
System.out.println(jedis.hget("user","userName"));
HashMap<String, String> map = new HashMap<>();
map.put("role1","admin");
map.put("role2","user");
jedis.hmset("role",map);
System.out.println(jedis.hmget("role","role1"));
}
}
jedis的事务demo
Transaction multi = jedis.multi();
//放弃提交事务
multi.discard();
// 提交事务
// multi.exec();
因为他对事务是部分支持,所以一般都要加上watch
RedisPool
一般在多线程下并发访问redis,为了提高性能,会使用redis连接池(单例)
/**
* 工具方法,获取jedispool的单例
* @Author: Changwu
* @Date: 2019/3/28 14:10
*/
public class jedisPoolUtil {
private static volatile JedisPool jedisPool = null;
// 私有化构造方法
private jedisPoolUtil(){}
//提供工厂方法
public static JedisPool getJedisPoolInstance(){
if (jedisPool==null){
synchronized (jedisPoolUtil.class){
if (jedisPool==null){
// jedispool 的相关配置
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxIdle(32); // 最多有这么多尅空闲
poolConfig.setMaxTotal(500);
poolConfig.setMaxWaitMillis(100*1000); //最长等待的时间
poolConfig.setTestOnBorrow(true); // 获取redis连接时,是否检验redis的连接可用性
return new JedisPool(poolConfig,"192.168.43.150",6379);
}
}
}
return jedisPool;
}
/**
* 关闭具体某个池子的某个实例
* @param jedis
*/
public static void release(Jedis jedis){
if (jedis!=null){
jedis.close();
}
}
spring-data-redis
spring整个redis后提供了如下两个模板,供我们去操作redis
@RunWith(SpringRunner.class)
@SpringBootTest
public class BootRedisApplicationTests {
@Autowired
RedisTemplate redisTemplate;
@Autowired
StringRedisTemplate stringRedisTemplate;
- 前者的kv 全是object
- 后者的kv 全是string
大多数情况下,我们都是把string字符串往redis里面存储,所以更倾向于StringRedisTemplate
两套模板针对五大数据类型对应如下api,同样可读性依然超级好
| header 1 | header 2 |
|---|---|
| 操作字符串 | redisTemplate.opsForValue() |
| 操作hash | redisTemplate.opsForHash() |
| 操作list | redisTemplate.opsForList() |
| 操作set | redisTemplate.opsForSet() |
| 操作zset | redisTemplate.opsForZSet() |
注意点:
RedisTemplate 前者针对对象操作,要求我们的bean要是实现可序列化接口Serializable
- 默认会使用jdk默认的序列化机制,把序列化后的数据保存到redis,当我们直接去redis上查看存进去的对象时,看到的无异于一堆乱码(当然并没错,依旧可以通过反序列化得到对象)
如何解决?
- 我们可以先把对象手动转化成json,再存储到redis
- 定制RedisTemplate
在redis的自动配置类中我们可以看到它的自动配置
@Configuration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate<Object, Object> redisTemplate(
RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
跟进 RedisTemplate 可以找到他默认使用的序列化器是 jdk的
@Override
public void afterPropertiesSet() {
super.afterPropertiesSet();
boolean defaultUsed = false;
if (defaultSerializer == null) {
defaultSerializer = new JdkSerializationRedisSerializer(
classLoader != null ? classLoader : this.getClass().getClassLoader());
}
我们要做的就是定制一个自己的关于redis的配置类,让他覆盖掉自动配置
新建类,加@Configuration 注解 , 拷贝原自动配置类的代码段,替换掉 它指定序列化器的部分
@Configuration
public class redisConfig {
@Bean
public RedisTemplate<Object, 将被序列化的类名> redisTemplate(
RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object, 将被序列化的类名> template = new RedisTemplate<Object, 将被序列化的类名>();
template.setConectionFactory(redisConnectionFactory);
// 更换默认的序列化器
RedisSerializer ser= new Jackson2JsonRedisSerializer<将被序列化的类名>(将被序列化的类名.Class);
template.setDefaultSerializer(ser);
return template;
}
}
自动注入我们指定的redisTemplate
@Autowired
RedisTemplate<Object,将要序列化的类名> redisTemplate;
Jedis & spring-data-redis的更多相关文章
- 关于在项目中使用spring data redis与jedis的选择
项目中需要用到redis,主要用来作为缓存,redis的客户端有两种实现方式,一是可以直接调用jedis来实现,二是可以使用spring data redis,通过spring的封装来调用. 应该使用 ...
- Spring Data Redis与Jedis的选择(转)
说明:内容可能有点旧,需要在业务上做权衡. Redis的客户端有两种实现方式,一是可以直接调用Jedis来实现,二是可以使用Spring Data Redis,通过Spring的封装来调用.应该使用哪 ...
- Spring Data Redis入门示例:基于Jedis及底层API (二)
使用底层API:RedisConnectionFactory和RedisConnection可以直接操作Redis,下面是一个简单的例子: ### Maven依赖 <properties> ...
- spring data redis RedisTemplate操作redis相关用法
http://blog.mkfree.com/posts/515835d1975a30cc561dc35d spring-data-redis API:http://docs.spring.io/sp ...
- spring mvc Spring Data Redis RedisTemplate [转]
http://maven.springframework.org/release/org/springframework/data/spring-data-redis/(spring-data包下载) ...
- Spring Data Redis简介以及项目Demo,RedisTemplate和 Serializer详解
一.概念简介: Redis: Redis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写,详细的信息在Redis官网上面有,因为我自己通过google等各种渠道去学习Redis, ...
- Spring data redis的一个bug
起因 前两天上线了一个新功能,导致线上业务的缓存总是无法更新,报错也是非常奇怪,redis.clients.jedis.exceptions.JedisConnectionException: Unk ...
- spring data redis 理解
前言 Spring Data Redis project,应用了Spring概念来开发使用键值形式的数据存储的解决方案.我们(官方)提供了一个 "template" ,这是一个高级 ...
- Spring Data Redis 详解及实战一文搞定
SDR - Spring Data Redis的简称. Spring Data Redis提供了从Spring应用程序轻松配置和访问Redis的功能.它提供了与商店互动的低级别和高级别抽象,使用户免受 ...
- Spring Data Redis 让 NoSQL 快如闪电 (1)
[编者按]本文作者为 Xinyu Liu,详细介绍了 Redis 的特性,并辅之以丰富的用例.在本文的第一部分,将重点概述 Redis 的方方面面.文章系国内 ITOM 管理平台 OneAPM 编译呈 ...
随机推荐
- java基础篇一
引言 本人系南京一小小学校的大三小小菜鸟,三年来学了很多杂七杂八的,也荒废了大量的时间,马上就要秋招了,之前也看了不少面试题,备选了一些简单的项目,看了不知多少本的几百页厚的各种知识的pdf电子书,发 ...
- Spring Cloud第九篇 | 分布式服务跟踪Sleuth
本文是Spring Cloud专栏的第九篇文章,了解前八篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cl ...
- Spring Cloud第十一篇 | 分布式配置中心高可用
本文是Spring Cloud专栏的第十一篇文章,了解前十篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cl ...
- Java基础语法09-面向对象下-内部类
九.内部类 将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类. (1)成员内部类:声明在外部类中方法外 静态成员内部类 非静态成员内部类 (2)局部内部类:声明在外部类的方法 ...
- C#线程学习笔记四:线程同步
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/21/ThreadsSynchronous.html,记录一下学习过程以备后续查用. ...
- Springboot vue.js html 跨域 前后分离 shiro权限 集成代码生成器
本代码为 Springboot vue.js 前后分离 + 跨域 版本 (权限控制到菜单和按钮) 后台框架:springboot2.1.2+ mybaits+maven+接口 前端页面:html + ...
- FCC---CSS Flexbox: Apply the flex-direction Property to Create a Column in the Tweet Embed
The tweet embed header and footer used the flex-direction property earlier with a row value. Similar ...
- linux下安装与配置nfs服务器
NFS 什么是NFS?(NAS) NFS(网络文件系统):它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件和目录.NFS服务器可以允许NFS客户端将远端NFS服务器端的共享目录挂载到本地的N ...
- 解决video.js不兼容ie8问题
使用视频播放器的时候,常常会让兼容一些浏览器问题,比如兼容ie8浏览器.在工作中使用的是video.js. 如果需要兼容,引入两个js库,就可以做到兼容ie8浏览器 <script src=&q ...
- SpringAOP中切入点的高级使用
上一篇 SpringAOP之使用切入点创建通知 SpringAOP中切点的高级使用 一.使用控制流切入点(ControlFlowPointcut) 什么是控制流切入点呢?看下面的代码(为了方便,就写进 ...