再谈Redis。
两年前接触过Redis,具体可以参考Redis的安装和基本使用(一)
时隔两年,终于想起了更新这一个系列,由于当时写的安装步骤比较繁复,故本文将从安装配置开始重新介绍。
简介概述
REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。
Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。
应用场景:点赞、签到、打卡、关注、加入购物车等。
安装配置
访问官网进行下载,优先下载Stable版本,即稳定版。
下载tar.gz压缩包,并放到服务器上进行解压:
tar -xzvf redis-6.2.5.tar.gz
解压完之后,目录结构如下:
-rw-rw-r-- 1 root root 30644 Jul 22 02:06 00-RELEASENOTES
-rw-rw-r-- 1 root root 51 Jul 22 02:06 BUGS
-rw-rw-r-- 1 root root 5026 Jul 22 02:06 CONDUCT
-rw-rw-r-- 1 root root 3384 Jul 22 02:06 CONTRIBUTING
-rw-rw-r-- 1 root root 1487 Jul 22 02:06 COPYING
drwxrwxr-x 7 root root 4096 Jul 22 02:06 deps
-rw-rw-r-- 1 root root 11 Jul 22 02:06 INSTALL
-rw-rw-r-- 1 root root 151 Jul 22 02:06 Makefile
-rw-rw-r-- 1 root root 6888 Jul 22 02:06 MANIFESTO
-rw-rw-r-- 1 root root 21567 Jul 22 02:06 README.md
-rw-rw-r-- 1 root root 93724 Jul 22 02:06 redis.conf
-rwxrwxr-x 1 root root 275 Jul 22 02:06 runtest
-rwxrwxr-x 1 root root 279 Jul 22 02:06 runtest-cluster
-rwxrwxr-x 1 root root 1079 Jul 22 02:06 runtest-moduleapi
-rwxrwxr-x 1 root root 281 Jul 22 02:06 runtest-sentinel
-rw-rw-r-- 1 root root 13768 Jul 22 02:06 sentinel.conf
drwxrwxr-x 3 root root 4096 Jul 22 02:06 src
drwxrwxr-x 11 root root 4096 Jul 22 02:06 tests
-rw-rw-r-- 1 root root 3055 Jul 22 02:06 TLS.md
drwxrwxr-x 9 root root 4096 Jul 22 02:06 utils
- 在根目录下执行编译命令
make
- 在根目录下执行安装命令
# 指定PREFIX前缀表示将所有的可执行指向根目录,后续卸载直接删除整个文件夹即可
make PREFIX=/usr/local/redis-6.2.5 install
- 启动Redis,使用/usr/local/redis-6.2.5/redis.conf的配置文件,默认启动端口6379(可通过配置文件修改)
./bin/redis-server& ./redis.conf
配置文件中需要关注bind 127.0.0.1 -::1这一行,若要开放远程访问,则需要将该行注释,并且必须要设置密码,否则将会进入到默认保护模式,只允许本机访问。
找到requirepass关键词,打开注释并设置一个密码
关闭保护模式
protected-mode no
- 校验是否能够访问
本机访问,需要依赖redis客户端,即同样需要到官网下载redis压缩包解压后,在bin目录下就有redis-cli文件:
#host:远程redis服务器host
#port:远程redis服务端口
#password:远程redis服务密码(无密码的的话就不需要-a参数了)
redis-cli -h host -p port -a password
本机访问如果在设置了密码的前提下,你不加-a参数还是能够进入到redis的命令行,但是没有任何操作权限。
使用RDM(Redis Desktop Manager)远程访问,这里需要下载对应的桌面管理工具。
Redis的基本命令操作
- 选择某个库(redis有16个库,且从索引0开始命名至15,下文有解释)
# 选择第16个库
select 15
- 设置键值对
# 键为key 值为value
set key value
- 通过键找值
# 通过键为key找值,返回value
get key
- 查询所有的键
keys *
- 查询键的类型
# 5大类型:string、list、set、hash、sorted set
type key
- 获取hash表中的所有域
hkeys key
SpringBoot实现Redis连接
- 创建一个SpringBoot工程 引入Redis依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
- 编辑application.properties的配置文件
## redis配置
spring.redis.host=
## Redis服务器连接端口
spring.redis.port=6379
## 连接超时时间(毫秒)
spring.redis.timeout=10000
## Redis服务器连接密码
spring.redis.password=
## 连接池中的最大连接数
spring.redis.poolMaxTotal=10
## 连接池中的最大空闲连接
spring.redis.poolMaxIdle=10
## 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.poolMaxWait=3
## 使用第16个数据库
spring.redis.database=15
- 新建Redis服务接口类
import java.util.Map;
public interface IRedisService {
/**
* String-Map
* @param key
* @param value
*/
void setValue(String key, Map<String, Object> value);
/**
* String-String
* @param key
* @param value
*/
void setValue(String key, String value);
/**
* String-Object
* @param key
* @param value
*/
void setValue(String key, Object value);
/**
* 通过key获取元素
* @param key
* @return
*/
Object getValue(String key);
}
- 新建Redis接口实现类
import com.surprise.service.IRedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* @author Vainycos
* @description
* @date 2021/8/5 10:42
*/
@Service
public class RedisServiceImpl implements IRedisService {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private RedisTemplate redisTemplate;
@Override
public void setValue(String key, Map<String, Object> value) {
ValueOperations<String, Object> vo = redisTemplate.opsForValue();
vo.set(key, value);
// 这里指的是1小时后失效
redisTemplate.expire(key, 1, TimeUnit.HOURS);
}
@Override
public void setValue(String key, String value) {
ValueOperations<String, Object> vo = redisTemplate.opsForValue();
vo.set(key, value);
// 这里指的是1小时后失效
redisTemplate.expire(key, 1, TimeUnit.HOURS);
}
@Override
public void setValue(String key, Object value) {
ValueOperations<String, Object> vo = redisTemplate.opsForValue();
vo.set(key, value);
// 这里指的是1小时后失效
redisTemplate.expire(key, 1, TimeUnit.HOURS);
}
@Override
public Object getValue(String key) {
ValueOperations<String, String> vo = redisTemplate.opsForValue();
return vo.get(key);
}
}
- 新建Redis入口类
import com.surprise.service.IRedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Vainycos
* @description
* @date 2021/8/5 10:44
*/
@RestController
public class RedisController {
@Autowired
IRedisService iRedisService;
/**
* 取值
* @param key
* @return
*/
@RequestMapping("/getValueByKey")
Object getValueByKey(String key){
return iRedisService.getValue(key);
}
/**
* 设置键值对
* @param key
* @param value
*/
@RequestMapping("/setKeyValue")
void setKeyValue(String key, String value){
iRedisService.setValue(key, value);
}
}
基本的Redis操作Java实现就已经完成了。
接下来我们结合实际业务需求进行实战演练,从而加强印象。
Redis实操
Redis有16个数据库,且从db0开始命名,分别为db1、db2…db15。为什么有16个数据库,可以参考这篇文章你是否知道Redis为什么有16 个数据库?,其中解释的较为详细。
当我们安装好redis后,通过客户端进入默认选中的是db0。
如果我们选择了其他db则需要使用select选择对应索引序号的db。
接下来我们模拟一个文章点赞的应用场景,使用redis来记录点赞情况。
分析一下业务场景:
- 首先用户发布文章,文章ID-发布用户ID存在唯一对应关系
- 用户点赞,点赞用户ID-文章ID存在唯一对应关系
- 取消点赞,需要取消点赞的用户ID-文章ID存在唯一对应关系
点赞和取消点赞都需要判断对应的用户是否已经点过赞或者取消了赞,不允许重复操作,且每个小时的整点将Redis中的数据更新至持久层数据库中。
基于以上模型,可以设计出对应的架构:使用Redis、MySQL、SpringBoot、mybatis-plus
仓库地址如下:GitHub-like-article,感谢原作者TiantianUpup
参考资料:
-
[Linux安装部署Redis(超级详细)](https://www.cnblogs.com/hunanzp/p/12304622.html)