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 使用的基本步骤 :

  1. 引入依赖 。
  2. 创建 Jedis 对象,建立连接 。
  3. 使用 Jedis ,方法名与 Redis 命令一致 。
  4. 释放资源
        <!--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 基本使用

  1. 引入 spring-boot-starter-data-redis 依赖
  2. 在 application.yml 配置 Redis 相关信息 ( 连接池 )
  3. 注入 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 的安装及企业级应用相关推荐

  1. Linux下redis的安装(适用centos)

    转自:https://www.cnblogs.com/_popc/p/3684835.html 第一部分:安装redis  希望将redis安装到此目录 1 /usr/local/redis 希望将安 ...

  2. Redis 入门安装(Linux)

    Redis 入门安装(Linux) 备注:该案例讲解基于CentOS6.5.Reids3.2.8 Redis 官网 中文地址:http://www.redis.cn/ 英文地址:https://red ...

  3. Redis初学:1(NoSQL的简介和Redis的安装)

    什么是NoSQL NoSQL数据库意即:Not Only SQL 不仅仅是SQL,它区别于传统的关系型数据库,储存方式按照的是key-value的形式存储数据,这个我们可以联想到我们以前学过的Hash ...

  4. Linux下redis的安装

    原文出处:http://www.cnblogs.com/_popc/p/3684835.html 第一步:redis的安装 希望将redis安装到此目录 1 /usr/local/redis 希望将安 ...

  5. Redis、Redis+sentinel安装(Ubuntu 14.04下Redis安装及简单测试)

    Ubuntu下Redis安装两种安装方式: 1.apt-get方式 步骤: 以root权限登录,切换到/usr目录下. 接下来输入命令,apt-get install redis-server,如图: ...

  6. redis的安装以及常见运用场景

    2019独角兽企业重金招聘Python工程师标准>>> 1.redis的安装 Window 下安装 下载地址:https://github.com/MSOpenTech/redis/ ...

  7. 浅谈Redis及其安装配置

    一.Redis的介绍 二.Redis的安装配置 三.Redis的配置文件说明 四.Redis的简单操作 简介: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型. ...

  8. linux redis数据库安装配置,Linux系统中redis的安装配置步骤

    Linux系统中redis的安装配置步骤 发布时间:2020-06-23 10:13:36 来源:亿速云 阅读:87 作者:Leah 这篇文章将为大家详细讲解有关Linux系统中redis的安装配置步 ...

  9. CentOS下Redis的安装

    CentOS下Redis的安装 前言 安装Redis需要知道自己需要哪个版本,有针对性的安装,比如如果需要redis GEO这个地理集合的特性,那么redis版本就不能低于3.2版本,由于这个特性是3 ...

最新文章

  1. xcode 4.3.2 use storyboard创建TableView
  2. Node.js 多版本安装方式
  3. 借助财务客户评估解决方案在云中构建AppDev
  4. java五子棋源代码_java 五子棋游戏源码
  5. JDBC中的Statement和PreparedStatement的区别
  6. windowsSDK加速键实例分析
  7. python netsnmp与pysnmp
  8. php和mysql不在同一服务器上_编译php时,如何解决mysql不在同一台机器上的操作问题?...
  9. 操作系统实验一linux,操作系统实验一 Linux基本操作.doc
  10. java 导出Excel 转图片地址为图片
  11. 样条曲线(spline)
  12. 数据结构与算法分析(五)队列
  13. 姓名拼音首字母缩写_2020年顶级网络安全首字母缩写
  14. 二项分布的特征函数及期望与方差 - 随机过程
  15. 大数据是什么?多大的数据叫大数据?
  16. 地理位置数据存储方案——Redis GEO
  17. jupyter notebook magic %time %%time 告诉你运行时长
  18. 大鱼吃小鱼小游戏完整版
  19. 《管理长歌行》—— 小花狗的错误
  20. cvRound cvFloor cvCei 和 int

热门文章

  1. 基于.NET的WebSocket实例:在线聊天室
  2. 用Java写“数字华容道”小游戏,适合初学者的小游戏
  3. QPushButton 设置背景颜色
  4. office2010怎么卸载干净
  5. redis 事务 多进程模拟秒杀 保证库存的正确 lua脚本和watch的方法
  6. Spring refresh流程
  7. DRAM auto-refresh和self-refresh区别
  8. Codeforces 700E. Cool Slogans
  9. Android Studio gradle配置阿里云仓库
  10. html怎么改无序图标,​css怎么设置无序列表?css的列表样式总结