核心技术点内容
:
1.Redis与其他缓存框架的对比
2.Redis环境安装linux/windows
3.Redis的数据类型与线程模型
4.Redis持久化的机制RDB和AOF
5.Redis队列的支持与事务
6.Redis缓存淘汰策略实现方案
7.Redis的高可用的机制
8.Redis应用场景与解决方案
Redis的官网:https://redis.io/
内存数据库(nosql数据库)、mysql、sqlserver
关系数据库存放在硬盘中 查询实现io操作
非关系数据库 Redis 持久化机制 淘汰策略
Jvm内置缓存框架 ECACH os cache
注意:Redis官方是没有windows版本的,只有linux,这时候因为 在nio中epoll只有linux操作系统独有
Redis单线线程模型
Redis的底层采用Nio中的多路IO复用的机制,能够非常好的支持这样的并发,从而保证线程安全问题;
Redis单线程,也就是底层采用一个线程维护多个不同的客户端io操作。
但是Nio在不同的操作系统上实现的方式有所不同,在我们windows操作系统使用select实现轮训时间复杂度是为o(n),而且还存在空轮训的情况,效率非常低, 其次是默认对我们轮训的数据有一定限制,所以支持上万的tcp连接是非常难。
所以在linux操作系统采用epoll实现事件驱动回调,不会存在空轮训的情况,只对活跃的 socket连接实现主动回调这样在性能上有大大的提升,所以时间复杂度是为o(1)
注意:windows操作系统是没有epoll,只有linux系统才有epoll
所以为什么nginx、redis都能够非常高支持高并发,最终都是linux中的IO多路复用机制epoll
Redis底层采用nio epoll实现
Linux环境下安装Redis
环境安装Redis
1.上传Redis的安装包
redis-5.0.6.tar.gz
2.解压我们的Redis安装包
tar -zxvf redis-5.0.6.tar.gz
3.mkdir /usr/redis //创建文件夹
4.make install PREFIX=/usr/redis
5.启动Redis cd /usr/redis/bin ./redis-server
环境核心配置
将Redis设置为后台启动
cp /usr/redis-5.0.6/redis.conf /usr/redis/bin
//需要进去配置文件修改
vi redis.conf daemonize yes
./redis-server ./redis.conf 重启启动Redis
ps aux | grep 'redis'
设置Redis账号密码
搜索:# requirepass foobared
requirepass 123456
客户端连接:auth 123456
设置Reids允许ip访问
//需要进去配置文件修改
注释掉bind 127.0.0.1
protected-mode no ###允许外界访问
Redis默认的情况下分为16个库
0-15
Redis数据结构
String类型、Hsh类型、List类型、Set类型 、Sorted-Sets
./redis-cli -h 192.168.212.155 -p 6379 -a 123456
String类型
String是redis最基本的类型,一个key对应一个value,sring类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象, Sring类型是Redis最基本的数据类型,一个键最大能存储512MB。
Set name mayikt
Gey name mayikt
Hash类型
我们可以将Redis中的Hash类型看成具有<key,<key1,value>>,其中同一个key可以有多个不同key值的<key1,value>,所以该类型非常适合于存储值对象的信息。如Username、Password和Age等。如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。
HMSET mayikt zhangsan 21
HGETALL mayikt
List类型
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
LPUSH mayiktlist xiaoming xiaojun xiaoxiao
LRANGE mayiktlist 0 10
Redis 集合(Set)
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
SADD mayiktset mayikt mayikt02 mayikt03
SMEMBERS mayiktset
Redis 有序集合(sorted set)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
ZADD mayikt 1 redis
ZADD mayiktsets 1 redis
ZRANGE mayiktsets 0 10 WITHSCORES
Redis如何存放一个java对象 直接存放json类型即可
Set key=user value={”userid”:100,”username”:yushengjun}
Xxl-sso 底层如何存放对象 存放二进制
SpringBoot整合Redis
在Redis存放一个对象 使用json序列化与反序列化
Maven依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<dependencies>
<!-- 集成commons工具类 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<!-- 集成lombok 框架 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.30</version>
</dependency>
<!-- SpringBoot-整合Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
<!-- 管理依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
工具类
```bash
@Component
public class RedisUtils {
@Autowired
private StringRedisTemplate stringRedisTemplate;
public void setString(String key, String value) {
setString(key, value, null);
}
public void setString(String key, String value, Long timeOut) {
stringRedisTemplate.opsForValue().set(key, value);
if (timeOut != null) {
stringRedisTemplate.expire(key, timeOut, TimeUnit.SECONDS);
}
}
public String getString(String key) {
return stringRedisTemplate.opsForValue().get(key);
}
}
控制层
@RestController
public class IndexController {
@Autowired
private RedisUtils redisUtils;
@RequestMapping("/setRedis")
public void setRedisKey(UserEntity userEntity) {
redisUtils.setString("userEntity", JSONObject.toJSONString(userEntity));
}
@RequestMapping("/getRedis")
public UserEntity setRedisKey() {
String userEntityJson = redisUtils.getString("userEntity");
UserEntity userEntity = JSONObject.parseObject(userEntityJson, UserEntity.class);
return userEntity;
}
}
配置文件
spring:
redis:
host: 192.168.212.155 //连接的地址
password: 123456 //配置的密码
port: 6379 //端口号
Redis的环境安装
一定要记住:Redis官方是没有windows版本的redis,只有linux版本的。
为什么Redis只有linux版本没有windows版本
Redis线程模型
Redis的采用nio的io多路复用原则,也就是一个线程(单线程)维护多个不同的redis客户端连接,从而提高处理并发效率和保证线程安全问题 底层采用linux操作系统的epoll技术避免空轮训。