博主关于Redis高级特性的一些讲解,传送地址如下:
删除策略与淘汰策略详解
主从复制详解
哨兵模式详解
集群详解
缓存预热 & 缓存雪崩 & 缓存击穿 & 缓存穿透
五大数据类型的应用场景
事务
布隆过滤器详解
文章目录- Redis快速入门
- 一、Redis概述
- 二、Redis应用场景
- 三、Redis的下载和安装
- 四、Redis服务的启动
- 五、Redis命令行工具
- 六、Redis基础知识
- 七、Redis数据类型
- 1. key (键)
- 2. String (字符串)
- 3. List (列表)
- 4. Set (集合)
- 5. Zset (有序集合)
- 6. Hash (哈希)
- 八、Redis常用查询指令
- 九、Jedis的使用
- 十、Redis可视化工具
- 十一、持久化概念
- 十二、RDB
- 十三、AOF
- 十四、AOF重写
- 十五、RDB与AOF的选择
- 概念
Redis是用C语言开发的一个开源的高性能基于内存运行的键值对NoSQL数据库
- 特征
(1) 支持数据的持久化,可以将数据保存在磁盘中,重启之后可以再次加载到内存中使用
(2) 支持多种数据类型,除了KV类型的数据,还支持list、set、hash等数据结构
(3) 支持master-slave模式的数据备份
- 热点数据加速查询(主要场景),如热点商品、热点信息等访问量较高的数据
- 即时信息查询,如公交到站信息、在线人数信息等
- 时效性信息控制,如验证码控制、投票控制等
- 分布式数据共享,如分布式集群架构中的session分离消息队列
- 去官网下载redis-3.0.4.tar.gz安装包,并放入Linux中的/opt目录
- 在/opt目录下,执行解压命令tar -zxvf redis-3.0.4.tar.gz
- 解压完成后出现文件夹redis-3.0.4
- 进入文件夹redis-3.0.4,在此目录下执行make && make install命令
- 进入默认安装目录cd /usr/local/bin,此目录中有如下文件
- 修改redis配置文件,vim /opt/redis-3.0.4/redis.conf
-
启动redis服务,cd /usr/local/bin,执行redis-server /opt/redis-3.0.4/redis.conf
-
查看服务是否启动,ps aux | grep redis-server
-
Redis采用单线程机制进行工作
-
Redis默认拥有16个数据库,数据库编号从0开始,默认使用0号数据库
-
使用select 数据库编号 可以切换使用的数据库
-
dbsize 命令查看当前数据库key的数量
-
keys * 命令查看当前数据库所有的key
-
flushdb 命令清空当前数据库
-
flushall 命令清空所有数据库
-
Redis中所有数据库使用同一个密码,默认没有密码,Redis认为安全层面应该由Linux来保证
-
Redis中所有索引都是从0开始
-
Redis默认端口是6379
Redis有五大数据类型:String、List、Set、Zset、Hash
注意:Redis采用键值对存储数据,key永远是String类型,五大数据类型指的是value部分2. String (字符串)
一个key对应一个value;String可以包含任何数据,比如jpg图片等;String是Redis最基本的 数据类型,一个String的value最大可支持512M
底层是一个字符串链表;可以从头或尾添加元素
注意:
(1) 添加元素时:
如果key不存在,创建新的链表
如果key已存在,添加内容
如果key的所有值全部删除,则对应的key也会随之消失
(2) 在链表的头尾 *** 作时效率较高,但是对中间元素的 *** 作效率较低
底层通过HashTable实现;是String类型的无重复值的无序集合
类似Set;每个元素都会关联一个double类型的分数(score);Redis通过分数自动的为集合中的 成员进行从小到大的排序;成员不可重复,分数可以重复
6. Hash (哈希)类似Java中的Map
- 单指令与多指令的选择
对于set与mset两个指令,应该使用哪一个由具体的业务场景决定
(1) set指令的执行过程
set指令发送给Redis服务器需要一个网络时间;Redis服务器执行该指令需要一个处理时间; Redis服务器将结果返回需要一个网络时间;故需要2个网络时间 + 1个处理时间
(2) 使用set存储n个值
n个网络时间(发送) + n个处理时间(处理) + n个网络时间(返回)
(3) 使用mset存储n个值
1个网络时间(发送) + n个处理时间(处理) + 1个网络时间(返回)
注:每次携带的数据增多,网络时间会相应的延长
综上所述,当需要处理的数据较少时,使用单指令;当处理的数据较多时,使用多指令
八、Redis常用查询指令 九、Jedis的使用- 首先需要在redis.conf配置文件中修改配置,需要重启Redis服务方可生效
-
修改之后,必须指定绑定的主机地址方可使用Redis
-
开放6379端口
- 创建Java项目并导入jar包
- src目录下创建redis.properties配置文件
#最大连接数 redis.maxTotal=50 #默认开启的活跃连接数 redis.maxIdel=10 #Linux的ip地址 redis.host=192.168.200.130 #redis的端口号 redis.port=6379
- 创建Jedis的工具类JedisUtils
public class JedisUtils { // 将从配置文件读取的配置信息赋予如下变量 private static int maxTotal; private static int maxIdel; private static String host; private static int port; // 端口号为int类型 // Jedis的连接池配置 private static JedisPoolConfig jedisPoolConfig; // Jedis连接池 private static JedisPool jedisPool; static { // 读取redis.properties配置文件 ResourceBundle bundle = ResourceBundle.getBundle("redis"); maxTotal = Integer.parseInt(bundle.getString("redis.maxTotal")); maxIdel = Integer.parseInt(bundle.getString("redis.maxIdel")); host = bundle.getString("redis.host"); port = Integer.parseInt(bundle.getString("redis.port")); // Jedis连接池配置 jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxTotal(maxTotal); jedisPoolConfig.setMaxIdle(maxIdel); jedisPool = new JedisPool(jedisPoolConfig, host, port); } public static Jedis getJedis() { return jedisPool.getResource(); } }
- 创建测试类JedisTest
public class JedisTest { public static void main(String[] args) { // 1. 获取Jedis对象 Jedis jedis = JedisUtils.getJedis(); // 2. 执行 *** 作,Jedis中 *** 作的方法名与Linux中命令行工具中的指令同名 jedis.sadd("key1", "abc", "abc", "def"); Long key1 = jedis.scard("key1"); System.out.println("运行结果:" + key1); // 3.关闭连接 jedis.close(); } }
- Linux中进行测试
-
安装软件
-
运行软件
-
意外断电或重启之后,内存中的数据将会丢失,故应当将内存中的数据保存在磁盘中
-
概念
利用磁盘等将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化
- 持久化的两种方式
(1) 快照
将某个时间点的工作状态保存下来,恢复时可直接恢复指定时间点的工作状态
Redis中这种方式称为RDB
(2) 日志
将对数据的所有 *** 作过程记录下来,恢复数据时重新执行这些 *** 作
Redis中这种方式称为AOF
十二、RDB- 对redis.conf配置文件进行修改 (修改配置文件后需要重启Redis)
(1) 修改内存中数据保存的文件的名称,默认值为dump.rdb
(2) 修改rdb文件保存的目录
-
执行save指令即可将内存中的数据保存到/opt/redis-3.0.4/目录的dump.rdb文件中
-
再次启动redis服务即可自动读取rdb文件中的数据并加载到内存
-
save指令工作原理
Redis是单线程的,故执行save指令会阻塞其之后的命令的执行(可能多人 *** 作同一个Redis 服务器),如果要保存的数据较多时,会导致之后的命令长时间阻塞,故一般不使用save指令
-
bgsave指令可以让保存 *** 作在后台执行,让redis服务可以继续执行其之后的指令,使用较多
-
bgsave指令工作原理
-
配置自动保存 (修改配置文件后需要重启Redis)
- 自动保存方式的注意点
(1) get *** 作没有导致key发生变化
(2) 对存在的key修改才算发生变化
(3) set k1 v1,set k1 v1认为key的值发生变化
(4) 配置方式执行的是bgsave指令
- RDB两种指令的对比
- RDB缺点
(1) 基于快照思想,每次读写都是全部数据,当数据量较大时,效率非常低
(2) 基于fork创建子进程,内存产生额外的消耗
(3) 宕机带来数据丢失风险(可能某个时间点的数据未保存)
- AOF概念
以日志的方式记录每次 *** 作的命令,重启之后执行AOF中保存的命令恢复数据,较为主流
- 对redis.conf配置文件进行修改 (修改配置文件后需要重启Redis)
- AOF执行策略
(1) everysec (每秒)
每秒将缓冲区的指令写入aof文件中,宕机会丢失0-1秒的数据,性能高,建议使用
(2) always (每次)
每次执行指令都将其写入aof文件中,数据零失误,性能较低,不建议使用
(3) no (系统控制)
由 *** 作系统控制写入aof文件的时间,不建议使用
注意:i. 只有使得key变化的指令才记录
ii. 重启之后自动从aof文件中读取指令并执行
iii. select指令虽然没有对key进行修改,但仍需记录,以知道数据存储的位置
- 概念
AOF文件中已经记录的对同一数据的若干条 *** 作的记录转换为数据最终结果对应指令的记录
- AOF重写作用
-
为防止数据量过大导致缓冲区溢出,合并后的每条指令最多写入64个元素
-
AOF重写方式
(1) 手动重写,执行bgrewriteaof指令
(2) 自动重写,修改配置文件
- 对比
- 选择策略
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)