离线安装
Redis是基于C语言编写的,因此首先需要安装Redis所需要的gcc依赖:
yum install -y gcc tcl
1. 源码下载
1.1 wget获取
下载到centos指定目录,我这里采用/home/installbags
cd /home/installbags
wget https://download.redis.io/releases/redis-7.0.2.tar.gz
2 编译安装
默认安装到了/usr/local/bin/目录,但是我想自定义安装到/tools/redis/
#解压
tar -zxf redis-7.0.2.tar.gz -C /home/installbags
#编译
make
#安装
make install PREFIX=/tools/redis
3. 启动
到/tools/redis/bin 下
redis的启动方式有很多种,例如默认启动,指定配置启动,开机自启动
./redis-server 默认启动
./redis-server /home/installbags/redis-7.0.2/redis.con 指定配置启动
redis配置信息
#允许访问的地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问,生产环境不要设置为0.0.0.0
bind 0.0.0.0
#守护进程,修改为yes后即可后台运行
daemonize yes
#设置后访问Redis必须输入密码
requirepass 123456
#设置后台启动,如果不是后台启动,每次推出redis就关闭了
daemonize yes
#开启密码保护,注释则不需要密码
requirepass 密码
#设置端口号
port 端口号
#允许访问的ip,改为0.0.0.0就是所有ip均可
bind 127.0.0.1 -::1
bind 0.0.0.0
开机自启
首先,新建一个系统服务文件
vim /etc/systemd/system/redis.service
内容如下
[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/redis-server /home/installbags/redis-7.0.2/redis.con
PrivateTmp=true
[Install]
WantedBy=multi-user.target
ExecStart=/redis-server /home/installbags/redis-7.0.2/redis.con
相当于指定配置启动
然后重载系统服务
systemctl daemon-reload
#启动
systemctl start redis
#停止
systemctl stop redis
#重启
systemctl restart redis
#查看状态
systemctl status redis
最后设置redis开机自启
systemctl enable redis
取消开机自启
systemctl disable redis.service
附加:
添加环境变量设置
添加了环境变量设置就可以在任意位置执行redis命令了
配置环境变量
##添加内容
vi ~/.bash_profile
#配置生效
source ~/.bash_profile
添加内容
REDIS_HOME=/tools/redis
PATH=$PATH:$REDIS_HOME/bin
云服务器
一般云服务器有防火墙,所以当我们将配置文件的bind 127.0.0.1 改为 bind 0.0.0.0这个时候还是不能够用自己的本地客户端连接云服务器上的redis,这个时候就需要到云服务器控制台安全组下配置一下放开6379端口。
知识点:
Memcache 与 Redis 区别
- Redis 和 Memcache 都是将数据存放在内存中,都是内存数据库。不过 Memcache 还可用于缓存
其他东西,例如图片、视频等等。 - Memcache 仅支持key-value结构的数据类型,Redis不仅仅支持简单的key-value类型的数据,
同时还提供list,set,hash等数据结构的存储 - 存储数据安全– Memcache 挂掉后,数据没了; Redis 可以定期保存到磁盘(持久化),灾难恢复– Memcache 挂掉后,数据不可恢复; Redis 数据丢失后可以通过 aof 恢复
- Memcache 的单个value最大 1m , Redis 的单个value最大 512m 。
Redis 的线程模型
Redis 内部使用文件事件处理器 file event handler ,这个文件事件处理器是单线程的,所以
Redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket ,根据 socket 上的事
件来选择对应的事件处理器进行处理。
使用:
- Redis常用数据类型与命令
字符串(String):
SET key value:设置指定key的值。
GET key:获取指定key的值。
SETEX key seconds value:设置指定key的值,并将key的过期时间设为seconds秒。
SETNX key value:只有在key不存在时设置key的值。
哈希(Hash):
HSET key field value:将哈希表key中的字段field的值设为value。
HGET key field:获取存储在哈希表中指定字段的值。
HDEL key field:删除存储在哈希表中的指定字段。
HKEYS key:获取哈希表中所有字段。
HVALS key:获取哈希表中所有值。
列表(List):
LPUSH key value1 [value2]:将一个或多个值插入列表头部(左侧)。
LRANGE key start stop:获取列表指定范围内的元素。
RPOP key:移除并获取列表最后一个元素。
LLEN key:获取列表长度。
集合(Set):
SADD key member1 [member2]:向集合添加一个或多个成员。
SMEMBERS key:返回集合中的所有成员。
SCARD key:获取集合的成员数。
SINTER key1 [key2]:返回给定所有集合的交集。
SUNION key1 [key2]:返回所有给定集合的并集。
SREM key member1 [member2]:删除集合中的一个或多个成员
有序集合(Sorted Set):
ZADD key score1 member1 [score2 member2]:向有序集合添加一个或多个成员。
ZRANGE key start stop [WITHSCORES]:通过索引区间返回有序集合中指定区间内的成员。
ZINCRBY key increment member:有序集合中对指定成员的分数加上增量increment。
ZREM key member [member…]:移除有序集合中的一个或多个成员。
- Spring Data Redis:
Spring-Data-Redis 是通过整合Lettuce和Jedis这俩种Redis客户端产生的,对外则提供了RedisTemplate这样统一的API来供调用者访问。它既支持Luttuce的响应式编程也支持JDK中集合的实现。
如何使用RedisTemplate
导入依赖:
<!--Redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--连接池依赖-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.11.1</version>
</dependency>
导入相关依赖之后,通过配置文件 application.yml 进行配置,由于 RedisTemplate 是整合的Lettuce和Jedis,因此在配置连接池的时候需要进行选择是使用Lettuce还是Jedis(默认是Lettuce)
spring:
data:
redis:
host: Redis所在主机地址
port: Redis对应端口号默认6379
password: 密码
lettuce:
pool:
max-active: 最大连接数
max-wait: 等待时长
max-idle: 最大空闲连接
min-idle: 最小空闲连接
RedisTemplate的API
RedisTemplate 提供了丰富的方法来实现对 Redis 的各种操作,包括但不限于字符串、哈希、列表、集合和有序集合等数据结构的操作。以下是一些常用的 RedisTemplate API:
字符串操作
opsForValue().set(key, value): 设置字符串值。
opsForValue().get(key): 获取字符串值。
opsForValue().incr(key): 字符串值自增。
opsForValue().decr(key): 字符串值自减。
哈希操作
opsForHash().getOperations().put(key, hashKey, value): 向哈希中添加键值对。
opsForHash().getOperations().get(key, hashKey): 获取哈希中的值。
opsForHash().getOperations().entries(key): 获取哈希中的所有键值对。
列表操作
opsForList().leftPush(key, value): 从列表左侧添加元素。
opsForList().rightPush(key, value): 从列表右侧添加元素。
opsForList().leftPop(key): 从列表左侧弹出元素。
opsForList().rightPop(key): 从列表右侧弹出元素。
集合操作
opsForSet().add(key, value): 向集合中添加元素。
opsForSet().members(key): 获取集合中的所有元素。
opsForSet().remove(key, value): 从集合中移除元素。
有序集合操作
opsForZSet().add(key, value, score): 向有序集合中添加元素,并指定分数。
opsForZSet().range(key, start, end): 获取有序集合中指定分数范围内的元素。
opsForZSet().removeRangeByScore(key, minScore, maxScore):
按分数范围移除有序集合中的元素。
键操作
delete(key): 删除键。
hasKey(key): 检查键是否存在。
keys(pattern): 根据模式匹配获取所有键。
事务
multi(): 开启事务。
exec(): 提交事务。
发布/订阅
convertAndSend(channel, message): 发布消息。
subscribe(RedisMessageListenerContainer, MessageListener): 订阅消息。
连接管理
getConnectionFactory(): 获取连接工厂。
getExecutor(): 获取执行器。
序列化
setKeySerializer(Serializer): 设置键的序列化器。
setValueSerializer(Serializer): 设置值的序列化器。
更多操作可以查看官方提供的API文档:RedisTemplate (Spring Data Redis 3.3.2 API)
序列化
我们打开Redis图形化工具查看一下刚才的验证码会发现刚才存入的验证码变成了一堆乱码
这是因为Redis的序列化并没有按照我们预期的进行转化,我们需要自己去重写一个序列化,如下将key设置为String类型、value设置为json类型,最后将这个对象交给Spring管理,之后在调用该对象的时候就会自动选择我们配置的这个
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
//创建RedisTemplate对象
RedisTemplate<String, Object> template = new RedisTemplate<>();
//设置连接工厂
template.setConnectionFactory(connectionFactory);
//创建JSON序列化工具
GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer();
//设置key的序列化
template.setKeySerializer(RedisSerializer.string());
template.setHashValueSerializer(RedisSerializer.string());
//设置value的序列化
template.setValueSerializer(jsonSerializer);
template.setHashValueSerializer(jsonSerializer);
return template;
}
}
这样后看结果
StringRedisTemplate
由于存储在 Redis 中的 key 和 value 通常是很常见的 String 类型,Redis模块提供了 RedisConnection 和 RedisTemplate 的扩展,分是 StringRedisConnection 和 StringRedisTemplate,作为字符串操作的解决方案。
高级特性
持久化:
RDB(Redis Database Backup):将Redis数据库的状态以快照的形式保存到磁盘上。
AOF(Append Only File):将Redis执行的所有写命令记录到一个追加日志文件中。
主从复制:
将一个Redis服务器设置为主服务器,其他Redis服务器设置为从服务器。从服务器会定期向主服务器发送同步请求,主服务器将数据同步到从服务器。
Sentinel:
Redis Sentinel是Redis的高可用解决方案之一。它可以监控Redis主从服务器的状态,当主服务器出现故障时,自动将从服务器提升为主服务器,实现故障自动切换。