配置文件、发布订阅、Java连接Redis【Redis篇2】

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 配置文件、发布订阅、Java连接Redis

1、配置文件

1.1、Units单位

1k => 1000 bytes
1kb => 1024 bytes
1m => 1000000 bytes
1mb => 1024*1024 bytes
1g => 1000000000 bytes
1gb => 1024*1024*1024 bytes

1.2、INCLUDES包含

  • 将公用的配置文件进行包含。
# include /path/to/local.conf
# include /path/to/other.conf

1.3、网络相关配置

# 默认情况bind=127.0.0.1只能接受本机的访问请求。不写的情况下,无限制接受任何ip地址的访问
bind 127.0.0.1 -::1

# 生产环境肯定要写你应用服务器的地址;服务器是需要远程访问的,所以需要将其注释掉。


protected-mode no # 将本机访问保护模式设置no



# 端口号,默认 6379
port 6379


# 设置tcp的backlog,backlog其实是一个连接队列,backlog队列总和=未完成三次握手队列 + 已经完成三次握手队列
tcp-backlog 511


# 一个空闲的客户端维持多少秒会关闭,0表示关闭该功能。即永不关闭。
timeout 0


# tcp-keepalive:就是对访问客户端每隔一定的时间就进行一次检测,如果检测在访问那么就会继续保持连接,如果没有处于连接状态,就会释放连接
tcp-keepalive 300

1.4、GENERAL通用

# 是否为后台进程,设置为yes。守护进程,后台启动
daemonize yes


# 存放pid文件的位置,每个实例会产生一个不同的pid文件
pidfile /var/run/redis_6379.pid


# 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为notice

# Specify the server verbosity level.
# This can be one of:
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)
loglevel notice



# 日志文件名称
logfile ""


# 设定库的数量 默认16,默认数据库为0,可以使用SELECT dbid命令在连接上指定数据库id
databases 16

1.5、SECURITY安全

# 访问密码的查看、设置和取消。默认情况下是没有密码
requirepass foobared

# 也可以通过以下方法进行临时设置密码,要永久改变密码,需要在配置文件中进行设置
config get requirepass

config set requirepass "123456"

auth 123456

1.6、LIMITS限制

# 设置redis同时可以与多少个客户端进行连接。默认情况下为10000个客户端。如果达到了此限制,redis则会拒绝新的连接请求,并且向这些连接请求方发出“max number of clients reached”以作回应。
maxclients 10000


# 建议必须设置,否则,将内存占满,造成服务器宕机。设置redis可以使用的内存量。一旦到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。
maxmemory <bytes>


# volatile-lru:使用LRU算法移除key,只对设置了过期时间的键;(最近最少使用)
# allkeys-lru:在所有集合key中,使用LRU算法移除key
# volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键
# allkeys-random:在所有集合key中,移除随机的key
# volatile-ttl:移除那些TTL值最小的key,即那些最近要过期的key
# noeviction:不进行移除。针对写操作,只是返回错误信息
maxmemory-policy noeviction # 默认情况


#     设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以你可以设置样本的大小,redis默认会检查这么多个key并选择其中LRU的那个。一般设置3到7的数字,数值越小样本越不准确,但性能消耗越小。

maxmemory-samples 5

2、发布和订阅

2.1、什么是发布和订阅?

  • Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息
  • Redis 客户端可以订阅任意数量的频道

2.2、图解发布和订阅

  1. 客户端可以订阅频道如下图

在这里插入图片描述

  1. 当给这个频道发布消息后,消息就会发送给订阅的客户端

在这里插入图片描述

2.3、发布订阅命令实现

第一个redis客户端订阅一个频道

127.0.0.1:6379> subscribe channel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1

第二个客户端在其频道上发布消息

127.0.0.1:6379> publish channel1 hello
(integer) 1

查看第一个客户端的变化

127.0.0.1:6379> subscribe channel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "message"
2) "channel1"
3) "hello"

3、Jedis测试

3.1、Jedis所需要的jar包

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.2.0</version>
</dependency>

3.2、连接时的注意事项

  • 禁用Linux的防火墙:Linux(CentOS7)里执行命令systemctl stop/disable firewalld.service
  • redis.conf中注释掉bind 127.0.0.1 ,然后 protected-mode no

3.3、测试

  • 创建相应的maven工程
  • 测试代码如下
import redis.clients.jedis.Jedis;



public class JedisTest {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("192.168.123.129");

        String ping = jedis.ping();

        System.out.println(ping);

        jedis.close();
    }
}
输出结果:PONG
// 说明已经联通了

3.4、测试相关的数据类型

3.4.1、Key

import redis.clients.jedis.Jedis;

import java.util.Set;


public class JedisTest {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("192.168.123.129");

        jedis.set("k1","v1");
        jedis.set("k2","v2");
        jedis.set("k3","v3");

        Set<String> keys = jedis.keys("*");

        System.out.println(keys.size());

        for(String key : keys){
            System.out.println(key);
        }

        Boolean k1 = jedis.exists("k1");
        System.out.println(k1);

        Long k2 = jedis.ttl("k2");
        System.out.println(k2);

        String k3 = jedis.get("k3");
        System.out.println(k3);

        jedis.close();
    }
}

测试结果

3
k3
k1
k2
true
-1
v3

3.4.2、String

import redis.clients.jedis.Jedis;

import java.util.List;



public class JedisTest {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("192.168.123.129");

        List<String> mget = jedis.mget("k1", "k2", "k3");

        for(String key : mget){
            System.out.println(key);
        }

        jedis.close();
    }
}

测试结果

v1
v2
v3

3.4.3、List

import redis.clients.jedis.Jedis;

import java.util.List;



public class JedisTest {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("192.168.123.129");

        List<String> k41 = jedis.lrange("k4", 0, -1);

        System.out.println(k41);

        jedis.close();
    }
}

测试结果

[v1, v2, v3, v4, v1, v2, v3, v4]

3.4.4、set

import redis.clients.jedis.Jedis;
import java.util.Set;


public class JedisTest {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("192.168.123.129");


        Long sadd = jedis.sadd("k5", "a1", "a2", "a3", "a1");
        System.out.println(sadd);

        Set<String> k5 = jedis.smembers("k5");

        for(String key : k5){
            System.out.println(key);
        }

        jedis.close();
    }
}

测试结果

3
a3
a1
a2

3.4.5、hash

import redis.clients.jedis.Jedis;

import java.util.HashMap;
import java.util.List;
import java.util.Map;



public class JedisTest {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("192.168.123.129");

        Map<String,String> map = new HashMap<>();
        map.put("name","jack");
        map.put("age","29");
        map.put("birthday","4.1");

        String k6 = jedis.hmset("k6", map);
        System.out.println(k6);

        List<String> mget = jedis.hmget("k6", "name", "age");
        for(String key : mget){
            System.out.println(key);
        }
        jedis.close();
    }
}

测试结果

OK
jack
29

3.4.6、zset

import redis.clients.jedis.Jedis;
import java.util.Set;


public class JedisTest {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("192.168.123.129");

        jedis.zadd("z1",100d,"java");
        jedis.zadd("z1",90d,"redis");
        jedis.zadd("z1",80d,"jedis");

        Set<String> z1 = jedis.zrange("z1", 0, -1);
        for(String key : z1){
            System.out.println(key);
        }
        jedis.close();
    }
}

测试结果

jedis
redis
java

4、SpringBoot整合redis

  1. 在pom.xml文件中引入redis相关依赖
<!-- redis -->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
 </dependency>

 <!-- spring2.X集成redis所需common-pool2-->
 <dependency>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-pool2</artifactId>
     <version>2.6.0</version>
 </dependency>
  1. application.properties配置redis配置
#Redis服务器地址
spring.redis.host=192.168.123.129
#Redis服务器连接端口
spring.redis.port=6379
#Redis数据库索引(默认为0)
spring.redis.database= 0
#连接超时时间(毫秒)
spring.redis.timeout=1800000
#连接池最大连接数(使用负值表示没有限制)
spring.redis.lettuce.pool.max-active=20
#最大阻塞等待时间(负数表示没限制)
spring.redis.lettuce.pool.max-wait=-1
#连接池中的最大空闲连接
spring.redis.lettuce.pool.max-idle=5
#连接池中的最小空闲连接
spring.redis.lettuce.pool.min-idle=0
  1. 添加redis配置类
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;

@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        template.setConnectionFactory(factory);
//key序列化方式
        template.setKeySerializer(redisSerializer);
//value序列化
        template.setValueSerializer(jackson2JsonRedisSerializer);
//value hashmap序列化
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        return template;
    }

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
// 配置序列化(解决乱码的问题),过期时间600秒
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(600))
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                .disableCachingNullValues();
        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }
}
  1. 测试一下:RedisTestController中添加测试方法
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RedisTestController {

    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping("/test")
    public String test(){
       redisTemplate.opsForValue().set("k1","v1");
        String k1 = (String) redisTemplate.opsForValue().get("k1");
        return k1;
    }
}
  1. 测试结果

在这里插入图片描述

相关实践学习
基于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
相关文章
|
25天前
|
缓存 运维 NoSQL
【Redis故障排查】「连接失败问题排查和解决」带你总体分析和整理Redis的问题故障实战开发指南及方案
【Redis故障排查】「连接失败问题排查和解决」带你总体分析和整理Redis的问题故障实战开发指南及方案
108 0
|
5天前
|
前端开发 NoSQL JavaScript
java域控连接AD遇到的问题
java域控连接AD遇到的问题
|
5天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
38 10
|
7天前
|
缓存 NoSQL Java
使用Redis进行Java缓存策略设计
【4月更文挑战第16天】在高并发Java应用中,Redis作为缓存中间件提升性能。本文探讨如何使用Redis设计缓存策略。Redis是开源内存数据结构存储系统,支持多种数据结构。Java中常用Redis客户端有Jedis和Lettuce。缓存设计遵循一致性、失效、雪崩、穿透和预热原则。常见缓存模式包括Cache-Aside、Read-Through、Write-Through和Write-Behind。示例展示了使用Jedis实现Cache-Aside模式。优化策略包括分布式锁、缓存预热、随机过期时间、限流和降级,以应对缓存挑战。
|
11天前
|
Java
Java配置大揭秘:读取自定义配置文件的绝佳指南
Java配置大揭秘:读取自定义配置文件的绝佳指南
14 0
Java配置大揭秘:读取自定义配置文件的绝佳指南
|
12天前
|
运维 NoSQL 算法
Java开发-深入理解Redis Cluster的工作原理
综上所述,Redis Cluster通过数据分片、节点发现、主从复制、数据迁移、故障检测和客户端路由等机制,实现了一个分布式的、高可用的Redis解决方案。它允许数据分布在多个节点上,提供了自动故障转移和读写分离的功能,适用于需要大规模、高性能、高可用性的应用场景。
16 0
|
16天前
|
存储 缓存 NoSQL
Java手撸一个缓存类似Redis
`LocalExpiringCache`是Java实现的一个本地缓存类,使用ConcurrentHashMap存储键值对,并通过ScheduledExecutorService定时清理过期的缓存项。类中包含`put`、`get`、`remove`等方法操作缓存,并有`clearCache`方法来清除过期的缓存条目。初始化时,会注册一个定时任务,每500毫秒检查并清理一次过期缓存。单例模式确保了类的唯一实例。
13 0
|
20天前
|
NoSQL 安全 网络安全
Redis连接:加速数据访问与保障安全传输的关键
Redis连接:加速数据访问与保障安全传输的关键
|
13天前
|
NoSQL Linux Redis
06- 你们使用Redis是单点还是集群 ? 哪种集群 ?
**Redis配置:** 使用哨兵集群,结构为1主2从,加上3个哨兵节点,总计分布在3台Linux服务器上,提供高可用性。
33 0
|
21天前
|
负载均衡 监控 NoSQL
Redis的集群方案有哪些?
Redis集群包括主从复制(基础,手动故障恢复)、哨兵模式(自动高可用)和Redis Cluster(官方分布式解决方案,自动分片和容错)。此外,还有如Codis、Redisson和Twemproxy等第三方工具用于代理和负载均衡。选择方案需考虑应用场景、数据规模和并发需求。
31 2