Jedis & spring-data-redis

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: 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上查看存进去的对象时,看到的无异于一堆乱码(当然并没错,依旧可以通过反序列化得到对象)


如何解决?

  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;
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
NoSQL Java Redis
redis-学习笔记(Jedis 通用命令)
redis-学习笔记(Jedis 通用命令)
49 1
|
2月前
|
NoSQL 网络协议 Java
[Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis
[Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis
43 7
|
2月前
|
NoSQL Java 网络安全
[Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis
[Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis
|
2月前
|
JSON NoSQL Java
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
这篇文章介绍了在Java中使用Redis客户端的几种方法,包括Jedis、SpringDataRedis和SpringBoot整合Redis的操作。文章详细解释了Jedis的基本使用步骤,Jedis连接池的创建和使用,以及在SpringBoot项目中如何配置和使用RedisTemplate和StringRedisTemplate。此外,还探讨了RedisTemplate序列化的两种实践方案,包括默认的JDK序列化和自定义的JSON序列化,以及StringRedisTemplate的使用,它要求键和值都必须是String类型。
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
|
3月前
|
NoSQL Java Linux
Jedis测试redis。(redis在linux虚拟机中)
该博客文章提供了使用Jedis客户端连接Linux虚拟机中的Redis服务器的步骤,包括Maven依赖配置、测试用例编写以及测试结果的截图。
|
3月前
|
缓存 NoSQL Java
【Azure Redis 缓存】定位Java Spring Boot 使用 Jedis 或 Lettuce 无法连接到 Redis的网络连通性步骤
【Azure Redis 缓存】定位Java Spring Boot 使用 Jedis 或 Lettuce 无法连接到 Redis的网络连通性步骤
|
3月前
|
缓存 NoSQL Java
【Azure Redis 缓存 Azure Cache For Redis】当使用Jedis客户端连接Redis时候,遇见JedisConnectionException: Could not get a resource from the pool / Redis connection los
【Azure Redis 缓存 Azure Cache For Redis】当使用Jedis客户端连接Redis时候,遇见JedisConnectionException: Could not get a resource from the pool / Redis connection los
118 0
|
4月前
|
Java Redis 数据安全/隐私保护
Redis14----Redis的java客户端-jedis的连接池,jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,最好用jedis连接池代替jedis,配置端口,密码
Redis14----Redis的java客户端-jedis的连接池,jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,最好用jedis连接池代替jedis,配置端口,密码
|
4月前
|
Java Redis 数据安全/隐私保护
Redis13的Java客户端-Jedis快速入门,建立连接的写法,ip地址,设置密码密码,选择库的写法
Redis13的Java客户端-Jedis快速入门,建立连接的写法,ip地址,设置密码密码,选择库的写法
|
4月前
|
安全 NoSQL Java
网络安全-----Redis12的Java客户端----客户端对比12,Jedis介绍,使用简单安全性不足,lettuce(官方默认)是基于Netty,支持同步,异步和响应式,并且线程是安全的,支持R
网络安全-----Redis12的Java客户端----客户端对比12,Jedis介绍,使用简单安全性不足,lettuce(官方默认)是基于Netty,支持同步,异步和响应式,并且线程是安全的,支持R