当我们了解了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上查看存进去的对象时,看到的无异于一堆乱码(当然并没错,依旧可以通过反序列化得到对象)

如何解决?

  1. 我们可以先把对象手动转化成json,再存储到redis
  2. 定制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的更多相关文章

  1. 关于在项目中使用spring data redis与jedis的选择

    项目中需要用到redis,主要用来作为缓存,redis的客户端有两种实现方式,一是可以直接调用jedis来实现,二是可以使用spring data redis,通过spring的封装来调用. 应该使用 ...

  2. Spring Data Redis与Jedis的选择(转)

    说明:内容可能有点旧,需要在业务上做权衡. Redis的客户端有两种实现方式,一是可以直接调用Jedis来实现,二是可以使用Spring Data Redis,通过Spring的封装来调用.应该使用哪 ...

  3. Spring Data Redis入门示例:基于Jedis及底层API (二)

    使用底层API:RedisConnectionFactory和RedisConnection可以直接操作Redis,下面是一个简单的例子: ### Maven依赖 <properties> ...

  4. spring data redis RedisTemplate操作redis相关用法

    http://blog.mkfree.com/posts/515835d1975a30cc561dc35d spring-data-redis API:http://docs.spring.io/sp ...

  5. spring mvc Spring Data Redis RedisTemplate [转]

    http://maven.springframework.org/release/org/springframework/data/spring-data-redis/(spring-data包下载) ...

  6. Spring Data Redis简介以及项目Demo,RedisTemplate和 Serializer详解

    一.概念简介: Redis: Redis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写,详细的信息在Redis官网上面有,因为我自己通过google等各种渠道去学习Redis, ...

  7. Spring data redis的一个bug

    起因 前两天上线了一个新功能,导致线上业务的缓存总是无法更新,报错也是非常奇怪,redis.clients.jedis.exceptions.JedisConnectionException: Unk ...

  8. spring data redis 理解

    前言 Spring Data Redis project,应用了Spring概念来开发使用键值形式的数据存储的解决方案.我们(官方)提供了一个 "template" ,这是一个高级 ...

  9. Spring Data Redis 详解及实战一文搞定

    SDR - Spring Data Redis的简称. Spring Data Redis提供了从Spring应用程序轻松配置和访问Redis的功能.它提供了与商店互动的低级别和高级别抽象,使用户免受 ...

  10. Spring Data Redis 让 NoSQL 快如闪电 (1)

    [编者按]本文作者为 Xinyu Liu,详细介绍了 Redis 的特性,并辅之以丰富的用例.在本文的第一部分,将重点概述 Redis 的方方面面.文章系国内 ITOM 管理平台 OneAPM 编译呈 ...

随机推荐

  1. OSU!

    OSU! 首先,由题可知,本题是个期望题,根据期望的套路,定义f[x]为x前的答案,所以最终答案就是f[n] f[x]表示前x期望答案,即每一段的长度立方和的期望(一定要清楚) 但是三次方不好算,由于 ...

  2. MySQL的安装、启动和基础配置 —— linux版本

    环境和资源地址 *** centos 7 *** http://repo.mysql.com/yum/mysql-5.6-community/ 安装 安装方式一(在线安装): # 查看和mysql有关 ...

  3. 【搞定Jvm面试】 面试官:谈谈 JVM 类加载过程是怎样的?

    类加载过程 Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟机是如何加载这些 Class 文件呢? 系统加载 Class 类型的文件主要三步:加载->连接->初始化.连接过程 ...

  4. Python基础-day01-9

    变量的命名 目标 标识符和关键字 变量的命名规则 0.1 标识符和关键字 1.1 标识符 标示符就是程序员定义的 变量名.函数名 名字 需要有 见名知义 的效果,见下图: 标示符可以由 字母.下划线 ...

  5. Java题库——Chapter17 二进制I/0

    Introduction to Java Programming 的最后一章,完结撒花!Chapter 17 Binary I/O Section 17.2 How is I/O Handled in ...

  6. 【活动】美团技术沙龙第49期:AI在外卖场景中的最佳实践

    美团技术沙龙第49期开始啦! 本次沙龙,美团外卖技术部专家会深入介绍AI在对话系统.图像处理.个性化推荐.智能营销等方向在外卖业务中的实践,希望与业界技术同学一起交流学习. 无论你从事智能搜索,或是算 ...

  7. 松软科技课堂:JS HTML DOM

    通过 HTML DOM,JavaScript 能够访问和改变 HTML 文档的所有元素. HTML DOM(文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Objec ...

  8. Elasticsearch(GEO)数据写入和空间检索

    Elasticsearch简介 什么是 Elasticsearch? Elasticsearch 是一个开源的分布式 RESTful搜索和分析引擎,能够解决越来越多不同的应用场景. 本文内容 本文主要 ...

  9. Java 密码加盐

    只对密码进行md5加密很容易反推出来,另外两个用户的密码相同时,数据库保存相同的密码,知道一个用户的密码就知道另一个.解决方法是在用户的短密码后面加上一段长字符,再计算 md5,这样反推出原始密码就变 ...

  10. webpack生成的css文件background-image url图片无法加载

    之前在使用webpack3构建基于less预处理的项目时,在对指定的元素使用background-image: url(xxx)来设置背景图片时,本地开发是ok的,但是在项目编译产出后背景图片就找不到 ...