Redis 的安装及企业级应用
01_初识 Reids
1. 认识 NoSQL (非关系型数据库)
关系型数据库与非关系型数据库对比
SQL | NoSQL | |
---|---|---|
数据结构 | 结构化 | 非结构化 |
数据关联 | 关联 | 无关联 |
查询方式 | SQL 查询 | 非 SQL 查询 |
事务特性 | ACID | BASE |
存储方式 | 磁盘 | 内存 |
扩展性 | 垂直 | 水平 |
使用场景 | 数据结构固定、相关业务对数据安全性、一致性要求较高。 | 数据结构不固定、对一致性、安全性要求不高、性能要求高 。 |
# 非结构化数据库
1. 键值类型 (Reids)
2. 文档类型 (MongoDB)
3. 列类型 (HBase)
4. Graph类型 (Neo4j)
Redis 诞生于 2009 年,全称 Remote Dictionary Server ,远程字典服务器,是一个基于内存的键值型 NoSQL 数据库 。
特征:
- 键值 (key-value) 型,value 支持多种不同的数据结构,功能丰富 。
- 单线程,每个命令具备原子性 。
- 低延迟、速度快 (基于内存、IO多路复用、良好的编码)
- 支持数据持久化 。
- 支持主从集群、分片集群 。
- 支持多语言客户端 。
02_Reids 的安装及启动
1. Redis 安装环境介绍
需要安装的环境:vmware 16 [ 虚拟机 ] 、CentOS 7 [ Linux 发行版 之一 ]
# Redis 是 C 语言开发 安装 Redis 需要编译源码,编译依赖 gcc 环境
# 解压完成后执行的 Linux 的命令
cd redis-6.2.7/ 进入 Redis 安装目录
make && make install 运行编译命令
默认安装路径: usr/local/bin/
2. 启动 Redis 方式
一 默认启动方式 : redis-server
二 指定配置启动 :
cp redis.conf redis.conf.bck
修改 redis.conf 文件中的一些配置
# 监听的地址 默认是 127.0.0.1 , 会导致只能在本地访问。修改为 0.0.0.0 则可以在任意 IP 下访问 。生产环境不要设置为 0.0.0.0 修改配置项一: bind 0.0.0.0# 守护进程,修改为 yes 后即可后台运行 修改配置项二: daemonize yes# 密码,设置后访问 Redis 必须输入密码 requirepass 826108531 # 远程访问 Redis 1. 永久关闭防火强 systemctl stop firewalld systemctl mask firewalld firewall-cmd --reload 2. 在防火墙中永久开放指定端口 firewall-cmd --zone=public --add-port=6379/tcp --permanent firewall-cmd --reload # 查看所有开放的端口 firewall-cmd --zone=public --list-ports
- Redis 的其它常见配置
# 监听的端口 port 6379 # 工作目录,默认是当前目录,也就是运行 redis-server 时的命令,日志、持久化文件会保存在这个目录下 dir . # 数据库数量,设置为 1 ,代表只能使用一个库,默认有 16 个库,编号 0-15 databases 1 # 设置 redis 能够使用的最大内存 maxmemory 512mb # 日志文件,默认为空,不记录日志,可以指定日志文件名 logfile "redis.log"
- 启动 Redis :
进入 redis 安装目录 : cd user/local/src/redis-6.2.7/
启动 : redis-server redis.conf
查看是否启动成功 : ps -ef | grep redis
- 停止 Redis 服务
利用 redis-cli 来执行 shutdown 命令,即可停止 Redis 服务,因为之前设置过密码,因此需要通过 -u 来指定密码 。redis-cli -u 826108531 shutdown
三 开机自启动 :
# vi /etc/systemd/system/redis.service
配置详情 : [Unit]
Description=redis-server
After=network.target[Service]
Type=forking# 这行配置内容要根据redis的安装目录自定义路径
ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-6.2.7/redis.conf
PrivateTmp=true[Install]
WantedBy=multi-user.target
systemctl damon-reload 重新加载服务
systemctl start redis 启动 Redis 服务
systemctl status redis 查看当前 Redis
systemctl stop redis 停止 Redis 服务
systemctl restart redis 重启 Redis 服务
systemctl enable redis 执行开机自启命令
03_Redis 客户端
安装完 Redis 后,就可以操作 Redis 了,实现数据的 CRUD ,这时就会使用到 Redis 客户端 。
Redis 客户端包括 :
- 命令行客户端
- 图形化桌面客户端
- 编程客户端
# 命令行客户端 Redis 安装完成后就自带命令行客户端 redis-cli # 语法: redis-cli {options-选项}{commonds-指令} 常见的 options : -h 127.0.0.1 指定要连接的 redis 节点的 IP 地址 默认 127.0.0.1 -p 6379 指定要连接的 redis 节点的端口 默认 6379 -a 826108531 指定 redis 的访问密码 命令行客户端连接 redis 的方式 : 1. redis-cli -h 192.168.130.129 -p 6379 -a 826108531 2. redis-cli -h 192.168.130.129 -p 6379 | AUTH 826108531 # ping 为 redis 的操作命令[commonds] 连接成功后通过 ping 命令与 redis 服务端做心跳测试 正常会返回 pong !不指定 commonds 时 会进入 redis-cli 的交互控制器 。 连接成功后 即可操作 redis 了 [ CRUD ]
# 图形化桌面客户端 AnotherRedisDesktopManager 一款比较稳定简洁的 redis UI 工具。 Redis Desktop Manager 一款基于Qt5的跨平台Redis桌面管理软件,目前已开始收费。 Redis Client 是Redis客户端的GUI工具,使用Java swt和jedis编写,可以方便开发者浏览Redis数据库。该软件支持简体中文,非常适合国内用户使用,不需要汉化就可以直接使用
04_Redis 常见命令
1. Redis 数据结构的介绍
Redis 是一个 key-value 的数据库 ,key 一般是 String 类型 ,value 类型多种多样 。
String | hello jack ! | <-value |
---|---|---|
Hash | { name: “jack” , age: 25 } | |
List | [ A -> B -> C -> D ] | |
Set | { A,B,C } | |
SortedSet | { A: 1 , B: 2 , C: 3 } | |
GEO | { A: (120.3 , 30.5) } | |
BitMap | 0110110101110101011 | |
HyperLog | 0110110101110101011 |
# String Hash List Set SortedSet 为基本类型 GEO BitMap HyperLog 为特殊类型
2. Redis 通用命令
通过 help [ command ] 可以查看一个命令的具体用法 例如:help keys
- KEYS : 查看符合模板的所有 key,不建议在生产环境设备上使用
- DEL : 删除一个指定的 key
- EXIST : 判断 key 是否存在
- EXPIRE : 给一个 key 设置过期时间,有效期到期时该 key 会被自动删除
- TTL : 查看一个 key 剩余有效期
- MSET : 批量插入 key-value 数据
3. String 类型
String 类型,字符串类型,是 Redis 中最简单的存储类型 。其 value 是字符串,根据字符串的格式不同,可以分为 3 类 :
- string :普通字符串
- int :整数类型,可以做自增、自减操作
- float :浮点类型,可以做自增自减操作
不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同 。字符串类型的最大空间不能超过 512 M 。
KEY VALUE msg hello world num 10 score 92.5 String 常见命令 :
- SET :添加或者修改已经存在的一个 String 类型的键值对 。
- GET :根据 key 获取 String 类型的 value 。
- MSET :批量添加多个 Strng 类型的键值对 。
- MGET :根据多个 key 获取多个 String 类型的 value 。
- INCR :让一个整型的 key 自增 1 。
- INCRBY :让一个整型的 key 自增,并指定步长 。
- INCRBYFLOAT :让一个浮点类型的数字自增并指定步长 。
- SETNX :添加一个 String 类型的键值对,前提是这个 key 不存在,否则不执行 。
- SETEX :添加一个 String 类型的键值对,并指定有效期 。
4. key 的结构
Redis 的 key 允许有多个单词形成层级结构,多个单词之间用 ’ : ’ 隔开,格式如下:
项目名 : 业务名 : 类型 : id
格式非固定,根据自己实际需求来定 。
# 例如项目名为 shop_jun,有 user 和 product 两种不同类型的数据,可以参考下面案例来定义 key 。
* shop_jun:user:1
* shop_jun:product:1
# 如果 value 是一个 java 对象,则可以将对象序列化为 json 字符串后存储 。[ 见下表格 ]
KEY | VALUE |
---|---|
shop_jun:user:1 | {“id”:1,“name”:“宋春峻”,“age”:25} |
shop_jun:product:1 | {“id”:1,“name”:“苹果14promax”,“price”:12999} |
总结:
String 类型的三种格式 :
- 字符串
- int
- float
Redis 的 key 格式 :
- [ 项目名 ] : [ 业务名 ] : [ 类型 ] : [ id ]
5. Hash 类型
Hash 类型 ,也叫散列,其 value 是一个无序字典,类似于 Java 当中的 HashMap 结构 。
String 结构是将对象序列化为 JSON 字符串后存储,当需要修改对象某个字段时很不方便 。
# Hash 结构可以将对象中的每个字段独立存储,可以针对单个字段做 CRUD 。[ 见下表格 ]
KEY | VALUE | VALUE |
---|---|---|
field | value | |
shop_jun:user:1 | name | 宋春峻 |
age | 25 | |
shop_jun:user:2 | name | 贺伟娜 |
age | 25 |
Hash 类型的常见命令 :
HSET key field value : 添加或修改 hash 类型 key 的 field 的值 。
HGET key field : 获取一个 hash 类型 key 的 field 的值 。
HMSET : 批量添加多个 hash 类型 key 的 field 的值 。
HMGET : 批量获取多个 hash 类型 key 的 field 的值 。
HGETALL : 获取一个 hash 类型的 key 中的所有 field 和 value 。
HKEYS : 获取一个 hash 类型的 key 中的所有 field 。
HVALS : 获取一个 hash 类型的 key 中的所有 value 。
HINCRBY : 让一个 hash 类型 key 的字段值自增并指定步长 。
HSETNX : 添加一个 hash 类型的 key 的 field 值,前提是这个 field 不存在,否则不执行 。
6. List 类型
Redis 中的 List 类型与 Java 中的 LinkedList 类似,可以看作是一个双向链表结构,既可以支持正向检索也可以支持反向检索 。
特点:
- 有序
- 元素可以重复
- 插入和删除快
- 查询速度一般
常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等 。
List 类型的常见命令 :
LPUSH key element … : 向列表左侧插入一个或多个元素 。
LPOP key : 移除并返回列表左侧的第一个元素,没有则返回 nil 。
RPUSH key : element … : 向列表右侧插入一个或多个元素 。
RPOP key : 移除并返回列表右侧的第一个元素 。
LRANGE key star end : 返回一段角标范围内的所有元素 。
BLPOP 和 BRPOP : 与 LPOP 和 RPOP 类似,只不过在没有元素时等待指定时间,而不是直接返回 nil 。[ 阻塞式 ]
# 如何利用 List 结构模拟一个栈 ? [ 先进后出 ]
入口和出口在同一边
# 如何利用 List 结构模拟一个队列 ? [ 先进先出 ]
入口和出口不在同一边
# 如何利用 List 结构模拟一个阻塞队列 ?
1. 入口和出口在不同边
2. 出队时采用 BLPOP 或 BRPOP
7. Set 类型
Redis 的 Set 结构与 Java 中的 HashSet 类似,可以看做一个 value 为 null 的 HashMap 。因为也是一个 hash 表,因此具备与 HashSet 类似的特征 :
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集 等功能
好友列表、共同好友、关注好友 …
Set 类型的常见命令 :
SADD key member … : 向 set 中添加一个或多个元素 。
SREM key member … : 移除 set 中的指定元素 。
SCARD key : 返回 set 中元素的个数 。
SISMEMBER key member : 判断一个元素是否存在于 set 中 。
SMEMBERS : 获取 set 中的所有元素 。
SINTER key1 key2 … : 求 key1 与 key2 的交集 。
SDIFF key1 key2 … : 求 key1 与 key2 的差集 。
SUNION key1 key2 … : 求 key1 与 key2 的并集 。
# Set 命令的练习
将下列数据用 Redis 的 Set 集合来存储 :
1. 宋春杰的好友有 : 鹿晗 王一博 贺伟娜
2. 贺伟娜的好友有 : 王一博 林俊杰 宋春杰
# 利用 Set 命令实现下列功能
1. 计算宋春杰的好友有几人
2. 计算宋春杰和贺伟娜有哪些共同好友
3. 查询哪些人是宋春杰的好友却不是贺伟娜的好友
4. 查询宋春杰和贺伟娜的好友总共有哪些人
5. 判断贺伟娜是否是宋春杰的好友
6. 判断宋春杰是否是贺伟娜的好友
7. 将宋春杰从贺伟娜的好友列表中移除
8. Sorted Set 类型
Redis 的 SortedSet 是一个可排序的 set 集合,与 Java 中的 TreeSet 有些类似,但底层数据结构差别却很大 。SortedSet 中的每一个元素都带有一个 score 属性,可以基于 score 属性对元素排序,底层的实现是一个跳表 ( SkipList ) 加 hash 表 。
特性 :
- 可排序
- 元素不可重复
- 查询速度快
因为 SortSet 的可排序特性,经常被用来实现排行榜这样的功能 。
SortSet 常见的命令 :
ZADD key score member : 添加一个或多个元素到 sorted set,如果已经存在则更新其 score 值 。
ZREM key member : 删除 sort set 中的一个指定的元素 。
ZSCORE key member : 获取 sorted set 中的指定元素的 score 值 。
ZRANK key member : 获取 sorted set 中的指定元素的排名 。
ZCARD key : 获取 sorted set 中的元素个数 。
ZCOUNT key min max : 统计 score 值在给定范围内的所有元素的个数 。
ZINCRBY key increment member : 让 sorted set 中的指定元素自增,步长为指定的 increment 值 。
ZRANGE key min max : 按照 score 排序后,获取指定范围内的元素 。
ZRANGEBYSCORE key min max : 按照 score 排序后,获取指定 score 范围内的元素 。
ZDIFF、ZINTER、ZUNION : 求差集、交集、并级 。
注意 : 所有的排名默认都是升序,如果要降序则在命令的 Z 后面添加 REV 即可 。
# SortedSet 命令练习
# 将班级的下列学生得分存入 Redis 的 SortSet 中 :
Jack 85,Luck 89,Rose 82,Tom 95,Jerry 78,Amy 92,Miles 76
# 实现下列功能
1. 删除 Tom 同学
2. 获取 Amy 同学的分数
3. 获取 Rose 同学的排名
4. 查询 80 分以下有几个学生
5. 给 Amy 同学加 2 分
6. 查出成绩前3名的同学
7. 查出成绩 80 分以下的所有同学
05_Redis 的 Java 客户端
- jedis
以 Redis 命令作为方法名称、简单实用 。但是 Jedis 实例是线程不安全的,多线程环境下需要基于连接池来使用 。
- lettuce
Lettuce 是基于 Netty 实现的 ,支持同步、异步和响应式编程方式,并且是线程安全的 。支持 Redis 的哨兵模式、集群模式和管道模式 。
- Redisson
Redisson 是一个基于 Redis 实现的分布式、可伸缩的 Java 数据结构集合。包括了诸如 Map、Queue、Lock、Semaphore、AtomicLong 等强大功能
1. Jedis
1. Jedis 基本使用
Jedis 使用的基本步骤 :
- 引入依赖 。
- 创建 Jedis 对象,建立连接 。
- 使用 Jedis ,方法名与 Redis 命令一致 。
- 释放资源
<!--jedis--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version></dependency><!--单元测试--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.8.2</version><scope>test</scope></dependency>
// 代码示例
public class JedisTest {private Jedis jedis;@BeforeEachvoid setUp() {// 1. 建立连接jedis = new Jedis("192.168.130.129", 6379);// 2. 设置密码jedis.auth("826108531");// 3. 选择库jedis.select(0);}@AfterEachvoid tearDown() {if (jedis != null) {jedis.close();}}@Testvoid testString() {String result = jedis.set("like", "二狗子");System.out.println("result =" + result);String name = jedis.get(like);System.out.println("like ="+ like);}
}
2. Jedis 连接池
Jedis 本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此使用 Jedis 连接池代替 Jedis 的直连方式 。
public class JedisConnectionFactory {private static final JedisPool jedisPool;static {// 配置连接池JedisPoolConfig poolConfig = new JedisPoolConfig();// 设置最大连接poolConfig.setMaxTotal(8);// 最大空闲连接poolConfig.setMaxIdle(8);// 最小空闲连接poolConfig.setMinIdle(0);// 设置最长等待连接 ,mxpoolConfig.setMaxWaitMillis(1000);// 创建连接池对象jedisPool = new JedisPool(poolConfig, "192.168.130.129", 6379, 1000, "826108531");}// 获取 Jedis 对象public static Jedis getJedis() {return jedisPool.getResource();}
}
2. SpringDataRedis
1. SpringDataRedis 介绍
SpringData 是 Spring 中数据操作的模块,包括对各种数据库的集成,其中对 Redis 的集成模块就叫做 SpringDataRedis 。
- 提供了对不同 Redis 客户端的整合 ( Jedis、Lettuce )
- 提供了 RedisTemplate 统一 API 来操作 Redis
- 支持 Redis 的发布订阅模型
- 支持 Redis 哨兵 和 Redis 集群
- 支持基于 Lettuce 的响应式编程
- 支持基于 JDK、JSON、字符串、Spring对象的数据序列化及反序列化
- 支持基于 Redis 的 JDKCollection 实现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rFoeUsPW-1672130571816)(C:\Users\宋春峻\Desktop\RedisTemplate.png)]
2. SpringDataRedis 基本使用
- 引入 spring-boot-starter-data-redis 依赖
- 在 application.yml 配置 Redis 相关信息 ( 连接池 )
- 注入 RedisTemplate
<!--redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--commons-pool--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency>
spring:redis:host: 192.168.130.130port: 6379password: 826108531lettuce:pool:max-active: 8min-idle: 8max-wait: 1000ms
@SpringBootTest
class SpringDataRedisJunApplicationTests {@Autowired(required = false)private RedisTemplate redisTemplate;@Testvoid testString() {// 写入一条数据 String 数据redisTemplate.opsForValue().set("sysadmin", "系统管理员");// 获取一条 String 数据Object sysadmin = redisTemplate.opsForValue().get("sysadmin");System.out.println("sysadmin =" + sysadmin);}
}
3. RedisTemplate 的 RedisSerializer
StringDataRedis 的序列化方式
RedisTemplate 可以接收任意 Object 作为值写入 Redis,只不过写入前会把 Object 序列化为字节形式,默认是采用 JDK 序列化,得到的结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CEeF7PxC-1672130571817)(C:\Users\宋春峻\AppData\Roaming\Typora\typora-user-images\image-20221104173354254.png)]
# 缺点 : 可读性差、内存占用较大 !
4. 自定义 RedisTemplate 的序列化方式
<!--jackson--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency>
package com.chunjun.redis.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {// 创建 RedisTemplate 对象RedisTemplate<String, Object> template = new RedisTemplate<>();// 设置连接工厂template.setConnectionFactory(connectionFactory);// 创建 JSON 序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// 设置 key 的序列化template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());// 设置 value 的序列化template.setValueSerializer(jsonRedisSerializer);template.setHashValueSerializer(jsonRedisSerializer);return template;}
}
package com.chunjun;import com.chunjun.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;@SpringBootTest
@Slf4j
class SpringDataRedisJunApplicationTests {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Testvoid testString() {// 写入一条数据 String 数据redisTemplate.opsForValue().set("sysadmin", "系统管理员");// 获取一条 String 数据Object sysadmin = redisTemplate.opsForValue().get("sysadmin");log.info("sysadmin = " + sysadmin);}@Testvoid testSaveUser() {// 写入数据 自动将对象序列化为 json 串redisTemplate.opsForValue().set("user:jun", new User("宋春峻", 25));// 读取数据 依据 redis 存储的 @class 实现将 json 串反序列化为所属对象User userInfo = (User) redisTemplate.opsForValue().get("user:jun");log.info("user:jun 的 value " + userInfo);}
}
自定义 RedisTemplate 的序列化方式,自动实现了数据的序列化和反序列化 。[ 由自动化序列化工具 RedisConfig 实现 ]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Czxc7jE4-1672130571818)(C:\Users\宋春峻\AppData\Roaming\Typora\typora-user-images\image-20221227102037102.png)]
5. 使用 SpringRedisTemplate 序列化方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-821Asgmh-1672130571818)(C:\Users\宋春峻\AppData\Roaming\Typora\typora-user-images\image-20221227102919525.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jseeBDP7-1672130571818)(C:\Users\宋春峻\AppData\Roaming\Typora\typora-user-images\image-20221227103202267.png)]
Spring 默认提供了 SpringRedisTemplate 类 ,其 key 和 value 的序列化方式默认就是 Spring 方式,省去了我们自定义 RedisTemplate 的过程 。代码如下 :
package com.chunjun;import com.chunjun.entity.User;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;import javax.annotation.Resource;@SpringBootTest
@Slf4j
class StringRedisTemplateTest {@Resourceprivate StringRedisTemplate stringRedisTemplate;private static final ObjectMapper mapper = new ObjectMapper();@Testvoid testString() {// 写入一条数据 String 数据stringRedisTemplate.opsForValue().set("testAdmin", "测试用户");// 获取一条 String 数据Object sysadmin = stringRedisTemplate.opsForValue().get("testAdmin");log.info("sysadmin = " + sysadmin);}@Testvoid testSaveUser() throws Exception {// 创建对象User info = new User("迈克尔杰克逊", 45);// 手动序列化对象String json = mapper.writeValueAsString(info);// 写入数据stringRedisTemplate.opsForValue().set("user:jackson", json);// 读取数据String stringJson = stringRedisTemplate.opsForValue().get("user:jackson");// 手动反序列化 jsonUser user = mapper.readValue(stringJson, User.class);log.info("user:jun 的 value " + user);}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NojbJ4MV-1672130571818)(C:\Users\宋春峻\AppData\Roaming\Typora\typora-user-images\image-20221227111300017.png)]
3. 总结 *
# RedisTemplate 的两种序列化实践方案
方案一 [ 会产生额外的内存开销 ]
1. 自定义 RedisTemplate
2. 修改 RedisTemplate 的序列化器为 GenericJackson2JsonRedisSerializer方案二
1. 使用 SpringRedisTemplate
2. 写入 redis 时 手动把对象序列化为 JSON
3. 读取 Redis 时 手动把读取到的 JSON 反序列化为对象
06_Redis 实战
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zncPrivY-1672130571819)(C:\Users\宋春峻\AppData\Roaming\Typora\typora-user-images\image-20221227131606441.png)]
1. 短信登陆
• 导入项目
• 基于 Session 实现登录
• 集群的 Session 共享问题
• 基于 Redis 实现共享 Session 登录
2. 商户查询缓存
3. 优惠卷秒杀
4. 达人探店
5. 好友关注
6. 附近的商户
7. 用户签到
8. UV 统计
= stringRedisTemplate.opsForValue().get(“user:jackson”);
// 手动反序列化 json
User user = mapper.readValue(stringJson, User.class);
log.info("user:jun 的 value " + user);
}
}
[外链图片转存中...(img-NojbJ4MV-1672130571818)]### 3. 总结 *```markdown
# RedisTemplate 的两种序列化实践方案
方案一 [ 会产生额外的内存开销 ]
1. 自定义 RedisTemplate
2. 修改 RedisTemplate 的序列化器为 GenericJackson2JsonRedisSerializer方案二
1. 使用 SpringRedisTemplate
2. 写入 redis 时 手动把对象序列化为 JSON
3. 读取 Redis 时 手动把读取到的 JSON 反序列化为对象
06_Redis 实战
[外链图片转存中…(img-zncPrivY-1672130571819)]
1. 短信登陆
• 导入项目
• 基于 Session 实现登录
• 集群的 Session 共享问题
• 基于 Redis 实现共享 Session 登录
2. 商户查询缓存
3. 优惠卷秒杀
4. 达人探店
5. 好友关注
6. 附近的商户
7. 用户签到
8. UV 统计
Redis 的安装及企业级应用相关推荐
- Linux下redis的安装(适用centos)
转自:https://www.cnblogs.com/_popc/p/3684835.html 第一部分:安装redis 希望将redis安装到此目录 1 /usr/local/redis 希望将安 ...
- Redis 入门安装(Linux)
Redis 入门安装(Linux) 备注:该案例讲解基于CentOS6.5.Reids3.2.8 Redis 官网 中文地址:http://www.redis.cn/ 英文地址:https://red ...
- Redis初学:1(NoSQL的简介和Redis的安装)
什么是NoSQL NoSQL数据库意即:Not Only SQL 不仅仅是SQL,它区别于传统的关系型数据库,储存方式按照的是key-value的形式存储数据,这个我们可以联想到我们以前学过的Hash ...
- Linux下redis的安装
原文出处:http://www.cnblogs.com/_popc/p/3684835.html 第一步:redis的安装 希望将redis安装到此目录 1 /usr/local/redis 希望将安 ...
- Redis、Redis+sentinel安装(Ubuntu 14.04下Redis安装及简单测试)
Ubuntu下Redis安装两种安装方式: 1.apt-get方式 步骤: 以root权限登录,切换到/usr目录下. 接下来输入命令,apt-get install redis-server,如图: ...
- redis的安装以及常见运用场景
2019独角兽企业重金招聘Python工程师标准>>> 1.redis的安装 Window 下安装 下载地址:https://github.com/MSOpenTech/redis/ ...
- 浅谈Redis及其安装配置
一.Redis的介绍 二.Redis的安装配置 三.Redis的配置文件说明 四.Redis的简单操作 简介: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型. ...
- linux redis数据库安装配置,Linux系统中redis的安装配置步骤
Linux系统中redis的安装配置步骤 发布时间:2020-06-23 10:13:36 来源:亿速云 阅读:87 作者:Leah 这篇文章将为大家详细讲解有关Linux系统中redis的安装配置步 ...
- CentOS下Redis的安装
CentOS下Redis的安装 前言 安装Redis需要知道自己需要哪个版本,有针对性的安装,比如如果需要redis GEO这个地理集合的特性,那么redis版本就不能低于3.2版本,由于这个特性是3 ...
最新文章
- xcode 4.3.2 use storyboard创建TableView
- Node.js 多版本安装方式
- 借助财务客户评估解决方案在云中构建AppDev
- java五子棋源代码_java 五子棋游戏源码
- JDBC中的Statement和PreparedStatement的区别
- windowsSDK加速键实例分析
- python netsnmp与pysnmp
- php和mysql不在同一服务器上_编译php时,如何解决mysql不在同一台机器上的操作问题?...
- 操作系统实验一linux,操作系统实验一 Linux基本操作.doc
- java 导出Excel 转图片地址为图片
- 样条曲线(spline)
- 数据结构与算法分析(五)队列
- 姓名拼音首字母缩写_2020年顶级网络安全首字母缩写
- 二项分布的特征函数及期望与方差 - 随机过程
- 大数据是什么?多大的数据叫大数据?
- 地理位置数据存储方案——Redis GEO
- jupyter notebook magic %time %%time 告诉你运行时长
- 大鱼吃小鱼小游戏完整版
- 《管理长歌行》—— 小花狗的错误
- cvRound cvFloor cvCei 和 int
热门文章
- 基于.NET的WebSocket实例:在线聊天室
- 用Java写“数字华容道”小游戏,适合初学者的小游戏
- QPushButton 设置背景颜色
- office2010怎么卸载干净
- redis 事务 多进程模拟秒杀 保证库存的正确 lua脚本和watch的方法
- Spring refresh流程
- DRAM auto-refresh和self-refresh区别
- Codeforces 700E. Cool Slogans
- Android Studio gradle配置阿里云仓库
- html怎么改无序图标,​css怎么设置无序列表?css的列表样式总结