072:Redis环境搭建与数据结构原理
1 Redis高级内容课程内容介绍
Redis实战原理核心技术点内容:
1 Redis与其他缓存框架的对比
2 Redis环境安装linux/windows
3 Redis的数据类型与线程模型
4 Redis持久化的机制RDB和AOF
5 Redis队列的支持与事务
6 Redis缓存淘汰策略实现方案
7 Redis的高可用的机制
8 Redis应用场景与解决方案
课程内容:
1.Redis线程模型
2.Redis五种基本数据类型
3.Linux环境安装Redis
4.SpringBoot操作Redis实现对象操作
2 Redis分布式缓存与本地缓存
Redis缓存框架基本介绍
Redis 是完全开源免费的,是一个高性能的key-value数据库,目前市面上主流的数据库
Redis、Memcache、Tair(淘宝自研发)
Redis的官网:https://redis.io/
内存数据库(nosql数据库)、mysql、sqlserver
关系数据库存放在硬盘中 每次查询实现io操作
非关系数据库 Redis 持久化机制、淘汰策略,支持分布式共享
Jvm内置缓存框架 EhCache、os cache
3 Redis的应用场景有那些
Redis的应用场景
- Token令牌的生成
- 短信验证码Code
- 实现缓存查询数据,减轻数据库访问压力
Redis与mysql数据不一致问题 - 帮助实现计数器
- 分布式锁
- 延迟操作
秒杀抢购 订单超时:30分钟内取消订单 库存+1 - 分布式消息中间件(发布订阅)
4 Redis线程模型IO多路复用
Redis官方是没有windows版本的redis,只有linux版本的。
为什么Redis只有linux版本没有windows版本?
Redis采用nio的io多路复用原则,也就是一个线程(单线程)维护多个不同的redis客户端连接,从而提高处理并发效率和保证线程安全问题,底层采用linux操作系统的epoll技术(事件回调)避免空轮询。
5 Redis前台启动环境安装
Linux环境下安装Redis
1 上传Redis的安装包 /usr
redis-5.0.6.tar.gz
2 解压我们的Redis安装包
tar -zxvf redis-5.0.6.tar.gz
3 mkdir /usr/redis
4 cd redis-5.0.6
make install PREFIX=/usr/redis
如报错gcc命令未找到
执行:yum -y install gcc automake autoconf libtool make
删除redis、redis-5.0.6目录重新执行以上234操作
5 启动Redis cd /usr/redis/bin ./redis-server
6 Redis设置允许外界访问
环境核心配置
将Redis设置为后台启动
cp /usr/redis-5.0.6/redis.conf /usr/redis/bin
cd /usr/redis/bin
vi redis.conf 修改daemonize yes
./redis-server ./redis.conf 重启启动Redis
ps aux | grep ‘redis’
设置Redis账号密码
vi redis.conf 修改# requirepass foobared
requirepass 123456
客户端连接:./redis-cli
auth 123456
设置Reids允许ip访问
关闭防火墙 systemctl stop firewalld
vi redis.conf注释掉# bind 127.0.0.1
protected-mode修改为no ###允许外界访问
7 Redis分为16个库的作用
Redis默认的情况下分为16个库
0-15,每个单独的库key不允许重复,不同的库key允许重复
8 Redis的五种数据类型
Redis数据结构
String类型、Hsh类型、List类型、Set类型 、Sorted-Sets
./redis-cli -h 192.168.206.101 -p 6379 -a 123456
String类型
String是redis最基本的类型,一个key对应一个value,redis的string可以包含任何数据。比如jpg图片或者序列化的对象, Sring类型是Redis最基本的数据类型,一个键最大能存储512MB。
Set name mayikt
Get name
Hash类型
将Redis中的Hash类型看成具有<key,<key1,value>>,其中同一个key可以有多个不同key值的<key1,value>,所以该类型非常适合于存储值对象的信息。如Username、Password和Age等。如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。
HMSET mayikt zhangsan 21 lisi 22 wangwu 23
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 mayikt03
SMEMBERS mayiktset
Redis 有序集合(sorted set)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
ZADD mayiktsets 1 redis
ZRANGE mayiktsets 0 10 WITHSCORES
Redis如何存放一个java对象
直接存放json类型即可
Set key=user value={“userid”:100,”username”:yushengjun}
Xxl-sso 底层如何存放对象 存放二进制
9 SpringBoot整合Redis框架
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>
工具类
@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);
}
}
其他代码
@Data
public class UserEntity {
private Long userId;
private String userName;
}
@RestController
public class RedisController {
@Autowired
private RedisUtils redisUtils;
@GetMapping("/addUser")
private String addUser(UserEntity userEntity) {
// 将对象转换为json
String jsonString = JSONObject.toJSONString(userEntity);
redisUtils.setString("userEntity", jsonString);
return "存储成功";
}
@GetMapping("/getUser")
public UserEntity getUser(String key){
String jsonString = redisUtils.getString(key);
UserEntity userEntity = JSONObject.parseObject(jsonString, UserEntity.class);
return userEntity;
}
}
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class);
}
}
配置文件application.yml
spring:
redis:
host: 192.168.206.101
password: 123456
port: 6379
database: 1
测试结果: