博客
关于我
Redis简介(数据结构,哨兵、集群和SpringDataRedis)
阅读量:408 次
发布时间:2019-03-06

本文共 5618 字,大约阅读时间需要 18 分钟。

Redis入门与实践指南

Redis简介

Redis是一种广泛应用的开源数据库系统,属于NoSQL数据库范畴,擅长处理非结构化数据。它支持多种数据类型,如字符串、哈希、列表、集合和有序集合,适用于高性能数据存储和实时数据处理。

Redis单机版安装

安装Redis前需安装C语言工具链:

yum install -y gcc-c++ automake autoconf libtool make tcl

下载并编译Redis:

cd /usr/local/tmp
git clone https://github.com/redis/redis.git
cd redis
make make install PREFIX=/usr/local/redis

启动Redis并配置守护进程:

cp redis.conf /usr/local/redis/bin
vim /usr/local/redis/bin/redis.conf
daemonize yes
# 修改bind并禁用protected-mode
./redis-server redis.conf

重启服务并测试:

./redis-cli shutdown
./redis-server redis.conf

启动客户端工具:

./redis-cli

Redis常用数据类型

Redis提供多种数据类型,适用于不同场景:

String(字符串)

用于存储不可变的值,支持动态长度调整。

Hash(哈希)

以键值对形式存储数据,适合结构化数据。

List(列表)

支持高效的增删改查,常用于有序数据存储。

Set(集合)

存储唯一值,支持快速 membership 检查。

Zset(有序集合)

结合集合和有序列表功能,支持按值排序查询。

Redis常用命令

以下是Redis中常用的键值操作命令:

Key操作

exists key # 判断key是否存在
expire key seconds # 设置过期时间
ttl key # 查看剩余过期时间
del key # 删除键值对

String操作

get key # 获取字符串值
setnx key value # 条件新增
setex key seconds value # 设置过期时间

Hash操作

hset key field value # 设置哈希值
hget key field # 获取哈希值
hmset key field value # 批量设置哈希值
hmget key field # 批量获取哈希值
hvals key # 获取所有哈希值
hgetall key # 获取所有哈希键值
hdel key field # 删除哈希字段

List操作

rpush key value # 向列表末尾添加值
lrange key start end # 范围查询列表值
lpush key value # 向列表前添加值
llen key # 获取列表长度
lrem key count # 删减列表中指定数量值

Set操作

sadd key value # 添加集合成员
scard key # 查看集合成员数量
smembers key # 获取所有集合成员

Zset操作

zadd key value # 添加有序集合成员
zrange key start end # 范围查询有序集合成员

Redis持久化策略

Redis支持两种持久化方式:RDB和AOF。

RDB

优点:支持快照备份,恢复速度快。 缺点:可能丢失部分数据,需定期备份。 开启RDB持久化:

# 修改redis.conf
cp redis.conf /usr/local/redis/bin/
vim /usr/local/redis/bin/redis.conf
appendonly yes
appendfilename appendonly.aof

AOF

优点:数据持久性更强,高安全性。 缺点:文件体积大,恢复速度慢。 开启AOF持久化:

vim /usr/local/redis/bin/redis.conf
# 确保appendonly yes

Redis主从复制

主从复制是一种高效的数据同步方式,适合分布式系统。

主从优点

主节点处理读写,从节点只负责读。

一主多从搭建

关闭主机Redis:

./redis-cli shutdown

创建从节点目录并复制配置文件:

mkdir /usr/local/replica
cp -r /usr/local/redis/bin/* /usr/local/replica/

修改从节点配置文件:

vim /usr/local/replica/slave1/redis.conf
replicaof 192.168.93.10 6379
port 6380

启动服务并验证同步状态:

cd /usr/local/replica/master/./redis-server redis.conf
cd /usr/local/replica/slave1/./redis-server redis.conf

Redis哨兵(Sentinel)

哨兵监控主从节点,自动故障转移。

搭建哨兵

创建哨兵目录并复制Redis:

mkdir /usr/local/sentinel
cp -r /usr/local/redis/bin/* /usr/local/sentinel

配置哨兵:

vim /usr/local/sentinel/sentinel.conf
port 26379
daemonize yes
sentinel monitor mymaster 192.168.93.10 6379 2

复制并修改哨兵配置文件:

cp sentinel.conf sentinel-26380.conf
vim sentinel-26380.conf
port 26380

启动哨兵和Redis服务:

cd /usr/local/sentinel/./redis-sentinel sentinel.conf sentinel-26380.conf sentinel-26381.conf

Redis集群

Redis集群通过复制机制实现高可用性和负载均衡。

集群搭建

配置Redis:

cp /usr/local/redis/bin/redis.conf /usr/local/redis/bin/redis-7001.conf
vim /usr/local/redis/bin/redis-7001.conf
cluster-enabled yes
cluster-node-timeout 15000

启动集群节点并初始化:

./redis-server redis-7001.conf
./redis-server redis-7002.conf
...

使用Redis-Trim命令初始化集群:

./redis-cli --cluster create 192.168.93.10:7001 192.168.93.10:7002 ... --cluster-replicas 1

Jedis与Spring Boot

Jedis是Redis客户端,支持连接池和集群操作。

Jedis简单使用

import org.jedis.Jedis;
import org.jedis.JedisPool;
public class JedisTest {
@Test
public void testStandalone() {
Jedis jedis = new Jedis("192.168.93.10", 6379);
jedis.set("name", "test-standalone");
String value = jedis.get("name");
System.out.println(value);
}
@Test
public void testPool() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(20);
jedisPoolConfig.setMaxIdle(5);
jedisPoolConfig.setMinIdle(3);
JedisPool jedisPool = new JedisPool(jedisPoolConfig, "192.168.93.10", 6379);
Jedis jedis = jedisPool.getResource();
jedis.set("name", "test-pool");
String value = jedis.get("name");
System.out.println(value);
}
@Test
public void testCluster() {
Set
set = new HashSet<>();
set.add(new HostAndPort("192.168.93.10", 7001));
set.add(new HostAndPort("192.168.93.10", 7002));
set.add(new HostAndPort("192.168.93.10", 7003));
set.add(new HostAndPort("192.168.93.10", 7004));
set.add(new HostAndPort("192.168.93.10", 7005));
set.add(new HostAndPort("192.168.93.10", 7006));
JedisCluster jedisCluster = new JedisCluster(set);
jedisCluster.set("name", "test");
String value = jedisCluster.get("name");
System.out.println(value);
}
}

Spring Boot整合

在Spring Boot项目中整合Redis:

import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.RedisConnectionFactory;
import org.springframework.data.redis.connection.ClusterConnectionFactory;
import org.springframework.data.redis.connection.PooledConnectionFactory;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new RedisConnectionFactory() {
@Override
public
T getConnection(String dbname, int port, String host, int timeout) {
return new ClusterConnectionFactory().createPooledConnection(
new PooledConnectionFactory(),
host,
port,
dbname,
timeout,
10000
);
}
};
}
}

总结

Redis作为高性能数据库,适用于多种场景。通过合理配置和管理,Redis可以成为企业级数据存储的重要组成部分。

转载地址:http://pxjkz.baihongyu.com/

你可能感兴趣的文章
numpy 数组与矩阵的乘法理解
查看>>
NumPy 数组拼接方法-ChatGPT4o作答
查看>>
numpy 用法
查看>>
Numpy 科学计算库详解
查看>>
Numpy.fft.fft和numpy.fft.fftfreq有什么不同
查看>>
numpy.linalg.norm(求范数)
查看>>
Numpy.ndarray对象不可调用
查看>>
Numpy.VisibleDeproationWarning:从不整齐的嵌套序列创建ndarray
查看>>
Numpy:按多个条件过滤行?
查看>>
Numpy:条件总和
查看>>
numpy、cv2等操作图片基本操作
查看>>
numpy中的argsort的用法
查看>>
NumPy中的精度:比较数字时的问题
查看>>
numpy判断对应位置是否相等,all、any的使用
查看>>
Numpy多项式.Polynomial.fit()给出的系数与多项式.Polyfit()不同
查看>>
Numpy如何使用np.umprod重写range函数中i的python
查看>>
numpy学习笔记3-array切片
查看>>
numpy数组替换其中的值(如1替换为255)
查看>>
numpy数组索引-ChatGPT4o作答
查看>>
numpy最大值和最大值索引
查看>>