如有侵权立马删除!!!!!!!!!! 一、Redis入门课程介绍d53faf57a96d4d99a2d57891bdc12a11.png 不仅有json这样字符串还有,List集合、哈希表....
NoSQL数据库
5ee4699f226d4ab2928eecaa5f17f461.png二、初识Redis-认识NoSQL1582073862cb49d0bd9e89d3a3494dc1.png4fa29f28fabb4bdf855400417c342180.png1.SQL 与 NoSQL 的区别 02975c05d0e74682a8c7d30c69847b1a.png 1.结构化(约束) / 非结构化
166e04bfcdfe4c8084d76bb2e2d0a143.png 2. 关联的 (外键) / 非关联的(嵌套,重复)
b5c0bda480bb46de8f6bb45c5a9a7309.png0a360d0481334dea96c2e756d923f46c.png 3. SQL 查询 / 非SQL (每一个库要学不同的语法)
fb271a751ada4ed59ade9b313f0966b9.png 4.事务方面: ACID(原子性、一致性、隔离性,持久性) / BASE (无事务,基本满足)
7de8cb46d86149b381abea36b2228d60.png 如果对数据安全性要求较高,要满足ACID。此时应该选择SQL型数据库,而不是NoSQL。
三、 初识Redis-认识Redis003a53b74e604b77afbcf01db3a6398f.png四、 初识Redis-安装Redis单机安装Redis安装Redis依赖 Redis是基于C语言编写的,因此首先需要安装Redis所需要的gcc依赖:
代码语言:javascript代码运行次数:0运行复制yum install -y gcc tcl上传安装包并解压编译并安装 然后将Redis安装包上传
我放到了/usr/local/src 目录:
这个目录一般情况下都是放我们的安装文件。
133942c068a54b8e8079d0df9b17e36c.png代码语言:javascript代码运行次数:0运行复制tar -xzf redis-6.2.6.tar.gz 解压后:进入redis目录
代码语言:javascript代码运行次数:0运行复制cd redis-6.2.6 运行编译 并 安装 命令
代码语言:javascript代码运行次数:0运行复制make && make install 如果没有出错,应该就安装成功了。
93f7430734dc4b5ba2c5280718b79128.png检查是否安装成功(安装目录)默认的安装路径是在 `/usr/local/bin`目录下:
代码语言:javascript代码运行次数:0运行复制cd /usr/local/bin 该目录以及默认配置到环境变量,因此可以在任意目录下运行这些命令。其中:
- redis-cli:是redis提供的命令行客户端
- redis-server:是redis的服务端启动脚本
- redis-sentinel:是redis的哨兵启动脚本
启动 redis的启动方式有很多种,例如:
- 默认启动
- 指定配置启动
- 开机自启
1.默认启动 安装完成后,在任意目录输入redis-server命令即可启动Redis:
这种启动属于`前台启动`,会阻塞整个会话窗口,窗口关闭或者按下`CTRL + C`则Redis停止。不推荐使用。
代码语言:javascript代码运行次数:0运行复制redis-server071fc470828c48088d8ecdd563d56de4.png redis启动成功。
2.指定配置启动(通过配置文件启动) 如果要让Redis以`后台`方式启动,则必须修改Redis配置文件,就在我们之前解压的redis安装包下(`/usr/local/src/redis-6.2.6`),名字叫redis.conf:
我们先将这个配置文件备份一份:
进入目录
代码语言:javascript代码运行次数:0运行复制cd /usr/local/src/redis-6.2.6备份
代码语言:javascript代码运行次数:0运行复制cp redis.conf redis.conf.bck修改redis.conf文件中的一些配置:(/name快速搜索文档内容)代码语言:javascript代码运行次数:0运行复制vi redis.conf①允许访问的地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问,生产环境不要设置为0.0.0.0
bind 0.0.0.0
d6a091379b1c4022862758816806c042.png②守护进程,修改为yes后即可后台运行
daemonize yes
22adc90ff3bb434ba28faa9fd94dcead.png③密码,设置后访问Redis必须输入密码
requirepass qyy2001
e7e4616b422844c381f024948074c48a.pngRedis的其它常见配置:监听的端口
port 6379
工作目录,默认是当前目录,也就是运行redis-server时的命令,日志、持久化等文件会保存在这个目录
dir .
数据库数量,设置为1,代表只使用1个库,默认有16个库,编号0~15
databases 1
设置redis能够使用的最大内存
maxmemory 512mb
日志文件,默认为空,不记录日志,可以指定日志文件名
logfile "redis.log"
后台启动)启动Redis:进入redis安装目录
cd /usr/local/src/redis-6.2.6
启动
redis-server redis.conf
查看启动的进程
ps -ef | grep redis
停止服务 可以直接杀死进程
ps -ef | grep redis
0bb46ca2fbaa423080e07d816f1542a8.png kill -9 402368
3.开机自启(推荐)我们也可以通过配置来实现开机自启。
首先,新建一个系统服务文件:
vi /etc/systemd/system/redis.service
内容如下:
[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-6.2.6/redis.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
然后重载系统服务:
systemctl daemon-reload
77a9727a050f42c7acebd5c0017e9763.png现在,我们可以用下面这组命令来操作redis了:
启动
systemctl start redis
停止
systemctl stop redis
重启
systemctl restart redis
查看状态
systemctl status redis
执行下面的命令,可以让redis开机自启:
systemctl enable redis
2ba2e99e352e43a994b116b26ac85e19.png五、redis命令行客户端 Redis安装完成后就自带了命令行客户端:redis-cli,使用方式如下:
redis-cli [options] [commonds]
常见的options有: -h 127.0.0.1:指定要连接的redis节点的IP地址,默认是127.0.0.1
这也可以省略不写,那么就是默认值。
外部连接
通过服务器的主机地址进行连接,这就和之前的配置文件有关系了,并且还和服务器的安全组、防火墙有关系。一定要开放6379这个端口号。否则连接不成功。
我的主机地址:113.44.83.92
-p 6379:指定要连接的redis节点的端口,默认是6379.这也可以省略不写,那么就是默认值。
-a qyy2001:指定redis的访问密码(不过我们一般不在这里指定。)
commonds就是Redis的操作命令,例如:
ping:与redis服务端做心跳测试,服务端正常会返回pong
74b6bbf66ac44e20bfe0500e23872c2b.png不指定commond时,会
进入 redis-cli 的交互控制台:053d91bd89e94a5294024cdfe510df35.png 基本操作(重点)
1.先连接上redis。进入 redis-cli 的交互控制台:(默认是通过本机地址进行连接)
redis-cli
1b3cd83613714e5d8c79ac93d64044c0.png也可以指定服务器地址连接
redis-cli -h 113.44.83.92
a8b075207fdb4873a8b52b4c018228d6.png 2.通过auth命令指定用户名和密码,用户名可选。此时没有用户名
auth qyy2001
aa748a2a6b924dbf8a9a2e2bcbd1352f.png3.ping 输出 pong代表连接成功
ping
a1b80a2dda7749a5b41ad70cf33d2ebc.png4. 增:
set name java
向redis里面存了一个键值对了。key是name,value是java
dba3ae038b854df0ad13e2ba4192741a.png 5.取:
get name
0ac38f554c764e3ba369efbc063a2579.png42fc948fa59e406e9f87838a4f6e9b29.png六、redis的图形化界面客户端 这是大神编写的。
操作示例 2f6d1822509b4f31b5a2be246fdac804.png连接成功67fedac7d0544f2ea0943e5b2e5de8e4.png 如上图显示了 redis 默认的 16 个数据库
点击别的库,新建数据。就可以添加新的键值对。 然后保存。
8985031367ed4db7bfc101a0d335d8cc.png在服务器上面查找到这个数据
选库操作(命令) select 1
get name
e87f8227c30c4278945e8f1888c7e9b1.png如果连接不成功可以进行如下修改的测试。注意之前的配置文件也要修改
关闭防火墙命令 systemctl stop firewalld
开启防火墙命令 sudo systemctl start firewalld
添加防火墙规则允许 6379 端口第一步:添加防火墙规则允许 6379 端口(TCP 协议)通过
sudo firewall-cmd --permanent --add-port=6379/tcp
第二步:
重新加载防火墙配置,使新添加的规则生效
sudo firewall-cmd --reload
修改redis.conf配置文件禁用 protected-mode: protected-mode no
958b8a3b12b448f89d569343ab27f61e.png保存配置文件后,重启 Redis 服务: sudo systemctl restart redis
从外部机器测试连接:telnet安装命令 yum install telnet - y
使用 telnet进行测试 telnet 113.44.83.92 6379
也可以在服务器上面根据服务器地址进行连接尝试连接失败原因 安全组配置错误。
我有多个实例的安全组。但是关联实例的安全组只有一个。
而恰好这个安全组没有开放
6379
的端口号。随后我添加了之后就好了。
dbfd976c8b2f47ba9effc0d27bd90eed.png七、redis命令-数据结构介绍数据结构介绍46ccd1822a934f6780603ec857a5de63.png 还有别的类型,如消息队列。后面会说到
官方文档查看命令 命令忘了没关系,主要是要会查
官方文档
9a402423e53840eba460c94cac323295.png3e35f8aca2f14432be2a9aaddba8d9d8.png 命令行查看官方文档fa06d1697d354971821885996aa2278e.pnga55978b5ba9b49a5941a0aad2bec3ca5.png 比如看String
96c1a575e21e4696a38a5c00c2f80d1c.png八、redis命令-通用命令(@genertic)官方文档放在Keys这个目录里面
bccb39294293408c933c6e0f592b9c97.png7f9199e6a7c2421e982a08fc96c9c539.png32ae0b76a76c44709bfb98b5b288b876.png 模糊匹配查询效率不高。
九、redis命令-String类型4e3e2524324a4d0bbdc248d794a9c23e.png小结: 21dce906c04d4b159f85909388b9ccd1.png十、redis命令-Key的层级格式思考:如何区分不同类型的keyfc5e2484a5b24cf5b98de5ccb1c94293.pngKey的结构c406058adb9d452994c7e62380320954.png示例:764b5956583e4bd69a31084c7a028c5b.pngd083fa4faaa84e22bd8a8f4c4b5ed50c.png 以冒号隔开,形成层级结构7633422b40c44693af91567a80bd2f71.png总结:3241a7b85f1b4a779728761815de8b0c.png十一、redis命令-Hash类型当成java中的Map操作。
f161ac6c8f3748b5bd8b4d6bf0edad9a.png86094a830d5649e1b35e32aeed8e01a1.png 示例:HSETacf00163dd23479588fceb330a0e7b8f.pngea873c2196e0440ea62b023d767f2de6.pngHGET8990a0f111e041199c7ad4ff4fbb8445.png HMSET9d49aac073764ae6bac180ca3684fac6.png90bc3b5a075544ca88763d8320bcd7bf.pngHGETALL570f60a1e0ed43b4917efd01ea93bc49.pngHKEYS374b3b48febb483ba007a610c53ea571.pngHVALS 4976e01d8696432d84f55ba40f8a1cf2.pngHINCRBY8ceb0dab59c6463d9282b321dcadc254.png HSETNX77669ac1e99f47729cc1b8702713cb67.png小结:00ae200db1964094927281dc08e5cc26.png十二、redis命令-List类型00a278a84c5a46129eed9af09b1eee87.png374ab357f8c44cd2bc3a8455f7d84b33.png1c74e794483943f58ea6d98bfd22cc7f.pnglpush e104b3b2de54451aa3c550567dded913.png8cb01a91888440d0b24bde0d5357ded7.png357c7b7eab8b443a855d42c26b8bfdbd.pnglpoprpop2e0e4ec0053a4684bad6e04f903f1060.pnge8c8e147f63647e895889b279b1bad63.pnglrange10e699d55430498aa267324ed3fb3a30.png160b298a42ec4473b7d2efebc01479d0.pngblpope7c1211db4bb4da3874003516bf48c2b.png 阻塞式获取。 等100秒、如果拿不到就报错
1d68af9fcd1e41bfb93a57e83924d456.png 在另一半插入数据。最终拿到数据。返回了数据和阻塞时间
brpop 类似rpop
思考三连:如何用list结构模拟栈、队列、阻塞队列dcb7b2713a71429487fd42b6036ee05d.png十三、redis命令-Set类型c0ecbdb7778f4cde9199db96a76a826c.png0e5e869bc0f246e486229cd6945becfe.png对单个集合操作 sadd9d4943251c03433691ffc04c55d31d8f.pngsmembers57060170ef9c454492ea073d16c6ec9e.pngsremc75647f87d50482483269a38707bef07.pngsismemberdecc9748005646a58e27fa1d96fc1193.pngscard0107dfd226b249589063e1c59445728f.pngsinter交集sdiff差集sunion并集bf45357c20bb4826847cf5f4b483f89a.png案例练习 743c22c4c81e4b688f6dab382cdcc908.png将下列数据用Redis的Set集合来存储:
•张三的好友有:李四、王五、赵六
44c8cf2c2167474db2467104e841b7c6.png •李四的好友有:王五、麻子、二狗
57403cfaf77640aab93e6c98ae195c63.png利用Set的命令实现下列功能:
•计算张三的好友有几人
bd90722fa37e4f549d003b0f91f27dee.png •计算张三和李四有哪些共同好友
ee248b3551d34893b3315ffb307c86dc.png •查询哪些人是张三的好友却不是李四的好友
ea4da09e507e4ad799e4e2fa2811bee3.png •查询张三和李四的好友总共有哪些人
51afc9c58fcf45c78a26304a3c04050c.png •判断李四是否是张三的好友
adfaf7d5d8134352bc7153ff79b25553.png •判断张三是否是李四的好友
41b82f6a478044f5b1f5a8badde768d7.png •将李四从张三的好友列表中移除
e004a454e8514d09a7a0a1f6d95c5c24.png十四、redis命令-SortedSet类型7382063054c542a8ac3bca137113629d.png248536c5854a4659bc93b4ae7ea5dad2.png69db408639ae4d44942fbdc3ff166c57.png案例:SortedSet命令练习将班级的下列学生得分存入Redis的SortedSet中:Jack 85, Lucy 89, Rose 82, Tom 95, Jerry 78, Amy 92, Miles 76
12e46415be0540abbdb9977ceb89080f.png •并实现下列功能:
•删除Tom同学
42629e278d4a478387f1a45cbfc4fc2c.png •获取Amy同学的分数
zscore stus amy
•获取Rose同学的排名
5d9c295075994f508cc5186dbfe0a039.png •查询80分以下有几个学生
267960100abf479db7de6d2638cd9243.png •给Amy同学加2分
3e672a23c8e24a0784050e1d7094f107.png •查出成绩前3名的同学
14969725bd8041278bed60c17b90dab9.png •查出成绩80分以下的所有同学
280122ce114a4474b26a934516a0cc36.png十五、Redis的客户端-客户端对比6c3b91bcb76c4c4f9b236b59c932ec38.png0d8b81dc829c45ce923ff9fcfcbff0c9.png7c0878845f8d4ae5b88cbaab14384ac0.png 十六、Jedis快速入门Jedis的官网地址: https://github.com/redis/jedis,我们先来个快速入门:
87a7e93479d14857ae47be86f45c78c1.png1.引入依赖:(官网地址可以找到)jedis依赖
代码语言:javascript代码运行次数:0运行复制
单元测试
代码语言:javascript代码运行次数:0运行复制
2.建立连接 private Jedis jedis;
@BeforeEach
void setUp() {
// 建立连接
jedis = new Jedis("192.168.150.101", 6379);
// 设置密码
jedis.auth("123321");
// 选择库
jedis.select(0);
}
3.测试String @Test
void testString() {
// 插入数据,方法名称就是redis命令名称,非常简单
String result = jedis.set("name", "张三");
System.out.println("result = " + result);
// 获取数据
String name = jedis.get("name");
System.out.println("name = " + name);
}
4.释放资源 @AfterEach
void tearDown() {
// 释放资源
if (jedis != null) {
jedis.close();
}
}
4a57481d648a4e05ae4be482f07030a3.pngd6057471627847a9b62afba87e6c7fb5.png 小结d66c0de10e184821b7653772a02fdf7c.png十七、Jedis的连接池ec8fca227f544d0689d1f37999544992.png实现连接池的使用 public class JedisConnectionFactory {
private static final JedisPool jedisPool;
static {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 最大连接
jedisPoolConfig.setMaxTotal(8);
// 最大空闲连接
jedisPoolConfig.setMaxIdle(8);
// 最小空闲连接
jedisPoolConfig.setMinIdle(0);
// 设置最长等待时间, ms
jedisPoolConfig.setMaxWaitMillis(200);
jedisPool = new JedisPool(jedisPoolConfig, "192.168.150.101", 6379,
1000, "123321");
}
// 获取Jedis对象
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
从池子里获取连接 14c15846bce64362bb8446c7679ad3a1.png释放资源则会归还到连接池962477bfcea843ab943b90ef52dabe55.png 十八、认识SpringDataRedis4e30d1703e1746088c986a369621e51f.pngSpringDataRedis快速入门 f7de7b329dc64a7b90c036ad2a6ab04f.png1.引入依赖(Redis依赖,连接池依赖) SpringBoot已经提供了对SpringDataRedis的支持,使用非常简单:
2.配置文件 spring:
redis:
host: 192.168.150.101
port: 6379
password: 123321
lettuce:
pool:
max-active: 8 # 最大连接
max-idle: 8 # 最大空闲连接
min-idle: 0 # 最小空闲连接
max-wait: 100 # 连接等待时间
现在的配置文件需要在redis后面加上data才行
3.注入RedisTemplate @Autowired
private RedisTemplate redisTemplate;
4.编写测试 @SpringBootTest
public class RedisTest {
@Autowired
private RedisTemplate redisTemplate;
@Test
void testString() {
// 插入一条string类型数据
redisTemplate.opsForValue().set("name", "李四");
// 读取一条string类型数据
Object name = redisTemplate.opsForValue().get("name");
System.out.println("name = " + name);
}
}
示例: dd2aa25fa5a64da096ad17309c12913e.png 在数据库中get。我们会发现找不到虎哥,因为它被"剁碎了”
这就和序列化相关了。会将字符串转成字节。
下一节会讲到
fd2c488c59024d89aacb8ceb1b9c90d9.png小结 12f171ae13424f149f43ed9c21ca6e53.png二十、SpringDataRedis的序列化方式 (自动序列化) RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化,得到的结果是这样的:
252dd19bafcb4660b77d3a87cc83e36a.png 缺点:
1.可读性差
2.内存占用较大
我们可以
自定义RedisTemplate的序列化方式,代码如下:
@Bean
public RedisTemplate
throws UnknownHostException {
// 创建Template
RedisTemplate
// 设置连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 设置序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer =
new GenericJackson2JsonRedisSerializer();
// key和 hashKey采用 string序列化
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setHashKeySerializer(RedisSerializer.string());
// value和 hashValue采用 JSON序列化
redisTemplate.setValueSerializer(jsonRedisSerializer);
redisTemplate.setHashValueSerializer(jsonRedisSerializer);
return redisTemplate;
}
05af6f4d06fb46a6b26ecc538ccfb948.png传入字符串 此时RedisTemplate就符合我们的预期了。
再回到单元测试。
给RedisTemplate加个泛型。
此时就可以往里面存取数据了。这次就能把虎哥正确写入。替代、Rose了
对了因为我们没有引入SpringMVC。因此还要手动引入一个Jackson依赖
b90c084c6fc249f9b18dfe1aabf89efc.png
此时虎哥写入进去了
b90567d6c5a042e2ba95e5519cba8054.png6c6b956edcdd47f192d93fc66feaa41f.png传入对象 74b171a8930c4030b130547f4b60f730.pngbbb8b6585a414ab49e7764f3877338c4.png二十一、StringRedisTemplate(序列化默认String方式) 尽管JSON的序列化方式可以满足我们的需求,但依然存在一些问题,如图:
6c5a2a4ef56c4e4eb7053980615167c8.png 为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。
手动序列化 (多了手动处理的过程)e908a511a9f34395b0416980a089bbab.pngStringRedisTemplate Spring默认提供了一个StringRedisTemplate类,它的key和value的序列化方式默认就是String方式。省去了我们自定义RedisTemplate的过程:
此时就可以这样写了。
存储对象 d434e16d6a13465f84d080888e481a57.png
@Autowired
private StringRedisTemplate stringRedisTemplate;
// JSON工具
private static final ObjectMapper mapper = new ObjectMapper();
@Test
void testStringTemplate() throws JsonProcessingException {
// 准备对象
User user = new User("虎哥", 18);
// 手动序列化
String json = mapper.writeValueAsString(user);
// 写入一条数据到redis
stringRedisTemplate.opsForValue().set("user:200", json);
// 读取数据
String val = stringRedisTemplate.opsForValue().get("user:200");
// 反序列化
User user1 = mapper.readValue(val, User.class);
System.out.println("user1 = " + user1);
}
f4f6d9572ab544a0bae7e46cc08bfc91.png7add94945298421da8acead5948712f9.png小结:bca593c0a9a0490b95768feac2174218.png二十二、RedisTemplate操作哈希类型d2881418632d47618dfb2efffc109ca5.pngf814838efef742b7930fc16b1821f2b8.png