分布式文件存储与数据缓存 Redis高可用分布式实践(上)(四)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 分布式文件存储与数据缓存 Redis高可用分布式实践(上)(四)

四、Redis可视化工具:Redis Destktop Manager(带时间)

4.1 下载Redis Desktop Manager

官网RESP.app (formerly Redis Desktop Manager) - GUI for Redis ® available on Windows, macOS, iPad and Linux.

或者使用文章配套的安装包。

4.2 连接Redis服务

关闭防火墙

systemctl stop firewalld.service

在redis配置文件中关闭保护模式

protected-mode no

开启远程访问

redis默认只允许本地访问,要使redis可以远程访问可以修改redis.conf。

注释掉bind 127.0.0.1 可以使所有的ip访问redi

重启redis服务

#查看redis端口
lsof -i:6379
#杀死redis进程
kill -9 PID
#重启reids服务
[root@localhost src]# ./redis-server ../redis.conf

- 出现16个库代表连接成功

五、Java整合Redis

5.1 Jedis操作

什么是Jedis

Jedis是Redis官方推荐的Java连接开发工具。

创建maven工程引入maven依赖

<dependency>
   <groupId>redis.clients</groupId>
   <artifactId>jedis</artifactId>
   <version>3.6.0</version>
</dependency>
<dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.12</version>
   <scope>test</scope>
</dependency>

Jedis连接到redis并操作redis

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.List;
import java.util.Set;
public class TestJedis {
    Jedis jedis;
    //1.创建连接实例
    @Before
    public void init(){
        /*
         * 第一个参数:redis服务的ip
         * 第二个参数:redis服务的端口
         */
        jedis = new Jedis("192.168.66.100",6379);
    }
    //2.Jedis-API:String
    @Test
    public void stringTest(){
        //设置一个键值对
        jedis.set("k1","v1");
        //通过key获取value
        String k1 = jedis.get("k1");
        System.out.println(k1);
        //对某一个key自增
        Long ires = jedis.incr("k2");
    }
    //2.Jedis-API:Keys
    @Test
    public void keysTest(){
        //返回所有的key
        Set<String> keys = jedis.keys("*");
        //返回该key剩余过期时间
        Long time = jedis.ttl("k1");
    }
    //3.Jedis-API:List
    @Test
    public void listTest(){
        //向list中添加数据
        jedis.lpush("list1","v1","v2","v3");
        //返回list全部数据
        List<String> list = jedis.lrange("list1",0,-1 );
    }
    //4.Jedis-API:Set
    @Test
    public void setTest(){
        //向set中添加数据
        jedis.sadd("set1" ,"v1","v2","v2","v3");
        //查看该集合中有多少个元素
        jedis.smembers("set1");
    }
    //4.Jedis-API:Hash
    @Test
    public void hashTest(){
        //设置一个hash
        jedis.hset("user","age","25");
        //获取该key的所有value
        jedis.hvals("user");
    }
    //4.Jedis-API:Zset
    @Test
    public void zsetTest(){
        //向zset中添加一条数据
        jedis.zadd("zset1",100,"java");
       //获取所有的值
        jedis.zrange("zset1",0,-1);
    }
    //5.Jedis-API:Bitmaps
    @Test
    public void bitmapsTest(){
        //将b1偏移量为0的位设置为1
        jedis.setbit("b1",0, "1");
        //获取b1偏移量为0的位
        jedis.getbit("b1",0);
    }
    //6.Jedis-API:Geospatia
    @Test
    public void geospatiaTest(){
        //添加一条地理信息数据
        jedis.geoadd("chinacity",130,110,"beijing");
    }
    //7.Jedis-API:Hyperloglog
    @Test
    public void hyperloglogTest(){
        //将所有元素参数添加到 Hyperloglog 数据结构中。
        jedis.pfadd("book","c++","java","php");
    }
    @After
    public void close(){
        //1.关闭连接实例
        jedis.close();
    }
}

注意:

其实jedis中的方法基本同redis命令一致。

5.2 Spring-Data-Reids

简介

Spring-Data-Redis是spring大家族的一部分,通过简单的配置访问Redis服务,对Reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了Redis各种操作、异常处理及序列化,支持发布订阅。

RedisTemplate介绍

Spring封装了RedisTemplate对象来进行对Redis的各种操作,它支持所有的Redis原生的api。

org.springframework.data.redis.core
Class RedisTemplate<K,V>

注意:

  • K:模板中的Redis key的类型,模板中的Redis key的类型(通常为String)如:RedisTemplate<String, Object>。
  • V:模板中的Redis value的类型

RedisTemplate中定义了对5种数据结构操作

redisTemplate.opsForValue();//操作字符串

redisTemplate.opsForHash();//操作hash

redisTemplate.opsForList();//操作list

redisTemplate.opsForSet();//操作set

redisTemplate.opsForZSet();//操作有序set

StringRedisTemplate与RedisTemplate

  • 两者的关系是StringRedisTemplate继承RedisTemplate。
  • 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
  • SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。
    StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
    RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

创建springboot项目并添加依赖

<dependencies>
     <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
     </dependency>
     <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
     </dependency>
     <dependency>
       <groupId>org.projectlombok</groupId>
       <artifactId>lombok</artifactId>
       <optional>true</optional>
     </dependency>
     <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-test</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>io.projectreactor</groupId>
       <artifactId>reactor-test</artifactId>
       <scope>test</scope>
     </dependency>
   </dependencies>

在application.properties中配置

#Redis服务器连接地址
spring.redis.host=192.168.56.31
#Redis服务器连接端口
spring.redis.port=6379
#连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
#连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
#连接池中的最大空闲连接
spring.redis.pool.max-idle=8
#连接池中的最小空闲连接
spring.redis.pool.min-idle=0
#连接超时时间(毫秒)
spring.redis.timeout=30000

自定义序列化

RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。该配置是将其序列化的方式改为json序列化。

package com.zj.redis.conf;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
 * 自定义序列化方式
 */
@Configuration
public class RedisConfig {
   @Bean
   public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
     RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
     redisTemplate.setKeySerializer(new StringRedisSerializer());
     redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
     redisTemplate.setHashKeySerializer(new StringRedisSerializer());
     redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
     redisTemplate.setConnectionFactory(redisConnectionFactory);
     return redisTemplate;
   }
}

没有配置自定义序列化之前:

配置自定义序列化之后:注意此时是json类型

package com.zj.redis;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import javax.annotation.Resource;
import java.util.Set;
@SpringBootTest
class RedisApplicationTests {
    @Resource
    private RedisTemplate redisTemplate;
    /*
    * 使用RedisTemplate实例操作redis
    * */
    //操作字符串
    @Test
    void contextLoads() {
        //添加数据(key是name,value是zhangsan)
        redisTemplate.opsForValue().set("name", "zhangsan");
        //获取数据
        System.out.println(redisTemplate.opsForValue().get("name"));
    }
    //操作list
    @Test
    void contextLoads2(){
        //添加数据
        redisTemplate.opsForList().rightPush("age",23);
        redisTemplate.opsForList().rightPush("age",24);
        redisTemplate.opsForList().rightPush("age",25);
        //获取最右边的数据
        System.out.println(redisTemplate.opsForList().rightPop("age"));
    }
    //操作Hash
    @Test
    void contextLoads3(){
        //添加
        redisTemplate.opsForHash().put("user","name","张三");
        redisTemplate.opsForHash().put("user","age",12);
        redisTemplate.opsForHash().put("user","address","临沂市");
        //获取
        System.out.println(redisTemplate.opsForHash().get("user", "name"));
    }
    //操作set
    @Test
    void contextLoads4(){
        //添加
        redisTemplate.opsForSet().add("verse","两岸猿声啼不住,轻舟已过万重山。","莫愁前路无知己,天下谁人不识君。",
                                                   "大鹏一日同风起,扶摇直上九万里。");
        //获取
        Set verse = redisTemplate.opsForSet().members("verse");
        System.out.println(verse);
        //获取元素长度
        System.out.println(redisTemplate.opsForSet().size("verse"));
    }
    //操作ZSet
    @Test
    void contextLoads5(){
        //添加元素
        redisTemplate.opsForZSet().add("programmer","Dennis MacAlistair Ritchie",100);
        redisTemplate.opsForZSet().add("programmer","Linus Benedict Torvalds",99);
        redisTemplate.opsForZSet().add("programmer","Bjarne Stroustrup ",98);
        redisTemplate.opsForZSet().add("programmer","Brain Wlison Kernighan",97);
        //获取元素
        Set programmer = redisTemplate.opsForZSet().range("programmer", 0, -1);
        System.out.println(programmer);
        //通过分数获取元素
        Set programmer1 = redisTemplate.opsForZSet().rangeByScore("programmer", 90, 100);
        System.out.println(programmer1);
    }
}


相关文章
|
1月前
|
缓存 负载均衡 监控
135_负载均衡:Redis缓存 - 提高缓存命中率的配置与最佳实践
在现代大型语言模型(LLM)部署架构中,缓存系统扮演着至关重要的角色。随着LLM应用规模的不断扩大和用户需求的持续增长,如何构建高效、可靠的缓存架构成为系统性能优化的核心挑战。Redis作为业界领先的内存数据库,因其高性能、丰富的数据结构和灵活的配置选项,已成为LLM部署中首选的缓存解决方案。
|
2月前
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
162 1
Redis专题-实战篇二-商户查询缓存
|
1月前
|
缓存 运维 监控
Redis 7.0 高性能缓存架构设计与优化
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Redis 7.0高性能缓存架构,探索函数化编程、多层缓存、集群优化与分片消息系统,用代码在二进制星河中谱写极客诗篇。
|
2月前
|
缓存 NoSQL 关系型数据库
Redis缓存和分布式锁
Redis 是一种高性能的键值存储系统,广泛用于缓存、消息队列和内存数据库。其典型应用包括缓解关系型数据库压力,通过缓存热点数据提高查询效率,支持高并发访问。此外,Redis 还可用于实现分布式锁,解决分布式系统中的资源竞争问题。文章还探讨了缓存的更新策略、缓存穿透与雪崩的解决方案,以及 Redlock 算法等关键技术。
|
6月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
6月前
|
缓存 NoSQL Java
Redis+Caffeine构建高性能二级缓存
大家好,我是摘星。今天为大家带来的是Redis+Caffeine构建高性能二级缓存,废话不多说直接开始~
891 0
|
6月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
228 32
|
6月前
|
缓存 NoSQL Java
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
153 5
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
|
8月前
|
缓存 NoSQL Java
Redis应用—8.相关的缓存框架
本文介绍了Ehcache和Guava Cache两个缓存框架及其使用方法,以及如何自定义缓存。主要内容包括:Ehcache缓存框架、Guava Cache缓存框架、自定义缓存。总结:Ehcache适合用作本地缓存或与Redis结合使用,Guava Cache则提供了更灵活的缓存管理和更高的并发性能。自定义缓存可以根据具体需求选择不同的数据结构和引用类型来实现特定的缓存策略。
516 16
Redis应用—8.相关的缓存框架
|
8月前
|
缓存 监控 NoSQL
Redis--缓存击穿、缓存穿透、缓存雪崩
缓存击穿、缓存穿透和缓存雪崩是Redis使用过程中可能遇到的常见问题。理解这些问题的成因并采取相应的解决措施,可以有效提升系统的稳定性和性能。在实际应用中,应根据具体场景,选择合适的解决方案,并持续监控和优化缓存策略,以应对不断变化的业务需求。
1659 29

热门文章

最新文章