Redis
2021-07-07 14:11:04 38 举报
AI智能生成
登录查看完整内容
Redis是一个开源的,基于内存的数据结构存储系统,可以用作数据库、缓存和消息中间件。它支持多种数据结构,如字符串、列表、集合、散列和有序集合。Redis具有高性能、高可用性和可扩展性的特点,适用于各种应用场景。它具有丰富的特性,如持久化、事务、发布订阅、管道等,能够满足不同需求。Redis采用单线程模型来处理客户端的请求,通过异步非阻塞的方式来提高性能。它还提供了多种编程语言的客户端库,方便开发者进行访问和操作。总之,Redis是一个功能强大且灵活的数据存储解决方案,被广泛应用于互联网行业。
作者其他创作
大纲/内容
Redis
Redis概述
1.什么是Redis
Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。
Redis全称为:Remote Dictionary Server(远程数据服务),该软件使用C语言编写,Redis是一个key-value存储系统
它支持丰富的数据类型,如:string、list、set、zset(sorted set)、hash。
2. Redis特点
Redis以内存作为数据存储介质,所以读写数据的效率极高,远远超过数据库。
以设置和获取一个256字节字符串为例,它的读取速度可高达110000次/s,写速度高达81000次/s。
Redis跟memcache不同的是,储存在Redis中的数据是持久化的,断电或重启后,数据也不会丢失。
Redis的存储分为内存存储、磁盘存储和log文件三部分,重启后,Redis可以从磁盘重新将数据加载到内存中,这些可以通过配置文件对其进行配置。
Redis支持主从模式,可以配置集群,这样更利于支撑起大型的项目,这也是Redis的一大亮点。
3. Redis应用场景
众多语言都支持Redis,因为Redis交换数据快,所以在服务器中常用来存储一些需要频繁调取的数据,这样可以大大节省系统直接读取磁盘来获得数据的I/O开销,更重要的是可以极大提升速度。
拿大型网站来举个例子,比如a网站首页一天有100万人访问,其中有一个板块为推荐新闻。要是直接从数据库查询,那么一天就要多消耗100万次数据库请求。上面已经说过,Redis支持丰富的数据类型,所以这完全可以用Redis来完成,将这种热点数据存到Redis(内存)中,要用的时候,直接从内存取,极大的提高了速度和节约了服务器的开销。
1.安装包下载
Redis官网下载页面: http://redis.io/download
Windows下Redis项目: https://github.com/MSOpenTech/redis
2.解压
1.redis-benchmark.exe #基准测试
2.redis-check-aof.exe # aof
3.redis-check-dump.exe # dump
4.redis-cli.exe \t# 客户端
5.redis-server.exe # 服务器
6.redis.windows.conf # 配置文件
3.安装运行
单实例运行
手动运行
redis-server.exe redis.windows.conf
服务运行
安装redis服务
redis-server --service-install redis.windows.conf --loglevel verbose命令注册服务
启动redis服务
redis-server --service-start开启服务
卸载redis服务
redis-server.exe --service-uninstall
客户端运行
redis-cli.exe 默认访问6379端口
redis-cli.exe -p 6380 访问指定的端口6380
主从复制
在一台机器上启动多个redis实例。需要将默认的redis.conf文件复制一份,然后修改一下对应的设置,保证多个redis实例不出现共享数据就可以了。
master主机配置
bind 127.0.0.1port 6379dbfilename dump.rdb
slave从机配置
bind 127.0.0.1port 6380dbfilename dump80.rdbslaveof 127.0.0.1 6379
redis持久化
RDB的配置和原理
快照(snapshotting)
相关配置
原理
当条件满足,redis需要执行RDB的时候,服务器会执行以下操作:1. redis调用系统函数fork() ,创建一个子进程。2.子进程将数据集写入到一个临时 RDB 文件中。3.当子进程完成对临时RDB文件的写入时,redis 用新的临时RDB 文件替换原来的RDB 文件,并删除旧 RDB 文件。
RDB的优点
1.RDB是一个非常紧凑(compact)的文件,它保存了redis 在某个时间点上的数据集。这种文件非常适合用于进行备份和灾难恢复。
2.生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。
3.RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快
RDB缺点
1.如果你需要尽量避免在服务器故障时丢失数据,那么RDB 不适合你。 虽然Redis 允许你设置不同的保存点(save point)来控制保存 RDB 文件的频率, 但是, 因为RDB 文件需要保存整个数据集的状态, 所以它并不是一个轻松的操作。 因此你可能会至少 5 分钟才保存一次 RDB 文件。 在这种情况下, 一旦发生故障停机, 你就可能会丢失好几分钟的数据。
2.每次保存 RDB 的时候,Redis 都要 fork() 出一个子进程,并由子进程来进行实际的持久化工作。 在数据集比较庞大时, fork() 可能会非常耗时,造成服务器在某某毫秒内停止处理客户端; 如果数据集非常巨大,并且 CPU 时间非常紧张的话,那么这种停止时间甚至可能会长达整整一秒。 虽然 AOF 重写也需要进行 fork() ,但无论 AOF 重写的执行间隔有多长,数据的耐久性都不会有任何损失。
AOF的配置和原理
只追加操作的文件(Append-only file,AOF)
快照功能并不是非常耐久(durable): 如果 Redis 因为某些原因而造成故障停机, 那么服务器将丢失最近写入、且仍未保存到快照中的那些数据。从 1.1 版本开始, Redis 增加了一种完全耐久的持久化方式: AOF 持久化。你可以在配置文件中打开AOF方式:appendonly yes从现在开始, 每当 Redis 执行一个改变数据集的命令时(比如 SET), 这个命令就会被追加到 AOF 文件的末尾。这样的话, 当 Redis 重新启时, 程序就可以通过重新执行 AOF 文件中的命令来达到重建数据集的目的。
redis的数据淘汰机制
volatile-lru :从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl :从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random :从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru :从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random :从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction (驱逐):禁止驱逐数据
使用策略规则
1.如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用allkeys-lru
2.如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random
数据淘汰策略
ttl和random比较容易理解,实现也会比较简单。主要是Lru最近最少使用淘汰策略,设计上会对key 按失效时间排序,然后取最先失效的key进行淘汰
4.Redis Client
核心接口
Jedis
JedisPoolConfig
JedisPool
核心方法
添加数据
获取数据
jedis.get("jeffrey")
修改数据
覆盖原有数据
删除数据
jedis.del("jeffrey");
key-value 数组存储
数组提取
map数据
jedis.hlen("user")
jedis.hkeys("user")
jedis.hvals("user")
5.与spring集成
方向1:解决Session共享问题
方向2:redis作为数据库使用
NoSql
redis数据类型
5种数据类型
分支主题
list数据类型
1.用做堆栈
图示
lpush
lrange
示例
2.用做队列
RPUSH
常用方法
关于lrang的用法
语法:lrang start stop
情况一:0通常表示第一个元素 1则是表示第二个,依次类推
情况二:-1表示最后一个元素 -2则表示最后一个元素之前的元素,依次类推
out of rang indexs不是一个错误:
如果start > end: 返回一个empty of list
如果end > 实际的最后一个值,则默认返回最大的值。(end为实际的end)
关于lpop的用法
语法:lpop key | 表示出栈/出队列中的第一个元素,并从原来的list集合中删除该元素
关于LREM的用法
语法:lrem key count value
删除count个值元素值为value的数据,返回被删除的元素数量。
*count>0 从头往后删除 count<0从尾往前删除
关于lset的用法
语法:lset key index value
设置链表中指定位置为新值
关于lindex的用法
语法:lindex key index
返回链表中指定下标的值
关于ltrim的用法
语法: ltrim key start stop
保留指定范围内的元素
redis的使用场景
添加缓存的逻辑的原则:缓存逻辑不能影响正常的业务逻辑执行
场景一:短信验证
短信校验是常用到的一项保证安全的,短信的验证码都是随机产生的,而且信息都是有时间限制的,一旦过了那个时间的有效期,验证信息就会自动删除。
图例
代码
Redis中事务
1、常用命令
multi
标识一个事务的开始
exec
执行某事务块内的所有命令
watch key…
监视一个或多个key,如果在事务执行之前这些被监视的key被其他命令修改,这该事务则被取消
unwatch
取消watch命令对所有key的监视
discard
放弃执行事务
2、实例操作
步骤
声明事务
命令入队(一个或多个命令)
执行事务
示例1
声明并执行事务
实例2
取消事务
示例3
利用两个客户端演示watch命令
自由主题
0 条评论
回复 删除
下一页