Redis入门

Redis是什么?

Redis是一款开源的内存数据结构存储,用作数据库,缓存和消息中间件,支持多种数据结构,如:strings,hashes,lists,sets,带有范围查询的sorted sets ,bitmaps,hyperloglogs,带有半径查询的geospatial Indexes,和stream;

Redis内置了的主从复制,事务,以及不同级别的持久化功能,并通过Sentinel和自动分区的Cluster提供了高可用性;

在redis中可以对这些类型进行原子操作(线程安全);

为了获得优秀的性能,redis把数据存储在内存中,根据实际情况你可以每隔一段时间将数据转存至磁盘或者追加每一个操作指令到log中,来实现持久化;如果只需要用于内存缓存,你可以禁用持久化;

redis还支持异步主从复制和非常快的非阻塞的首次同步,自动重连和部分数据重新同步在遇到网络分裂(异常)时;

Redis使用c编写,可以运行于绝大多数POSIX系统上,例如 Linux,OS X,BSD,而且不需要任何的外部依赖,Linux和OS X是Redis开发和测试最多的两个操作系统,建议使用LInux系统部署,Windows版本没有官方支持。

官网:https://redis.io

为什么需要Redis

可以看出redis和mysql有非常大的区别,主要体现在数据结构和存储方式上,mysql是关系型数据库,存储数据前必须明确定义表结构和数据类型,数据之间可以存在关联关系,而redis中并不需要提前定义数据模型,随时可以添加新的结构到数据库中,redis也不能维护数据间的关系;

NoSQL

这里不得不提到的一个名称就是NoSQL,NoSQL有两种含义

No Relations和Not Only SQL,通常我们谈及NoSQL都是泛指非关系型数据库,即数据之间没有关系;

NoSQL伴随着web2.0开始崛起,web2.0时代(要处理大规模的数据,且经常存在非结构化的数据)传统数据库表现的力不从心,而且出现一系列难以攻克的问题;

关系型与非关系型的对比:

对比项关系型非关系型
事务支持完整的事务支持,非常适合存储系统关键数据大多没有完整的ACID事务支持,数据的一致性较差,不支持回滚
存储方式完整数据存储在磁盘上,大多数操作都需要读写磁盘数据存储在内存中,仅在持久化时读写磁盘,且读写磁盘操作通常是非常少的
存储结构数据必须是结构化的,数据表需要预先定义好,可靠性,稳定性高,和维护性高,但当需要修改已有结构时非常的麻烦存储非结构化数据,不需要定义数据结构,任何时候任何地方都可以插入任何类型的数据,非常灵活,很容易适应数据类型和结构的变化
高性能一方面磁盘读写导致速度慢另一方面由于需要保证强一致性,通常会对需要并发操作的数据加锁直接对读写内存中的数据速度是非常快的,另外由于不需要保证强一致性,操作不需要加锁,效率非常高
扩展性整体效率依赖于IO速度,由于数据需要保证数据之间的一致性,且数据具备固定的结构,横向扩展困难,分库分表实施困难,且无法通用没有了固定存储结构,没有了强一致性要求,系统可以轻松的进行横向扩展,容易实现分布式,向资源池添加新的计算资源即可实现扩展
查询通过结构化查询语言(SQL)来完成,根据表中定义的key,来优化查询速度,可实现复杂的连表查询语句各个不同的NoSQL没有统一的标准,数据通常通过key来进行精准查询,无法实现太复杂的查询逻辑

通过对比可以发现NoSQL和关系型数据库各自有各自的优缺点,那么在实际运用中该如何选择呢?

一定要强调的是,两者不是非此即彼的关系,而是优势互补,通常我们把项目的关键数据(必须需要保证ACID)放在关系型数据库中,而对于一些临时的,非关键性的,访问频率非常高的数据放在NoSQL中;另外Redis也经常用于消息中间件;

NoSQL的分类:

在这里插入图片描述

Redis典型的使用场景:

  • 缓存(数据查询、短连接、新闻内容、商品内容等等)。
  • 分布式集群架构中的session分离。
  • 聊天室的在线好友列表。
  • 任务队列。(秒杀、抢购、12306等等)
  • 应用排行榜。
  • 网站访问统计。
  • 数据过期处理(可以精确到毫秒)

安装

windows下使用VMare安装CentOS7:链接

CentOS 7下安装Redis:链接

bin目录说明:

img

启动

指定使用redis.conf配置文件启动(先进入bin目录下)

./redis-server redis.conf
#利用客户端连接测试
./redis-cli -h 192.168.74.129 -p 65511
#看见如下内容表示已经服务端已经正常运行

在这里插入图片描述

停止

  1. 如果是前端方式启动的服务只需要ctrl+c即可关闭服务器端

  2. 后台进程模式,需要通过redis-cli客户端来关闭

    #关闭运行在localhost上的redis服务
    ./redis-cli shutdown
    #关闭运行在指定地址上的redis服务
    ./redis-cli -h 192.168.74.129 -p 65511 shutdown
    

    3.强制停止,通过kill命令直接强行结束redis服务端进程,该方式存在不稳定性,生产环境勿用

    #查询进程id
    ps aux|grep redis
    #根据进程id结束服务
    kill 进程id
    

    redis-cli连接服务器

    语法: redis-cli -h 主机地址 -p 端口

    其中主机地址和端口号均可省略 默认主机为localhost,默认端口为:6379

数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

1.String

string 是 redis 最基本的类型,你可以理解成与Map中的一模一样的数据类型,一个 key 对应一个value。

string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。

string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
1. 赋值
SET key value
如:
192.168.74.129:65511>set test 123

2. 取值
赋值与取值:
GET key
如:
192.168.74.129:65511> get test

当键不存在时返回空结果

3. 取值时同时对key进行赋值操作。
GETSET key value

4. 删除
Del key
如:
192.168.74.129:65511> del test

5. 数值加一
INCR key
当存储的字符串是整数时,Redis提供了一个实用的命令INCR,其作用是让当前键值递增,并返回递增后的值。
如:
192.168.74.129:65511> incr num

6. 增加指定的整数
INCRBY key increment
示例:
192.168.74.129:65511> incrby num 2

7. 数值减一
DECR key
如:
192.168.74.129:65511> decr num

2.Hash

hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。相当于一个key对应一个map。
在这里插入图片描述
1. 创建hash并添加值
HSET [key] [field] [value]
例如:
192.168.74.129:65511> hset hash1 field1 abc

2. 从hash中取值
HGET [key] [field]
例如:
192.168.74.129:65511> hget hash1 field1

3. 从hash中删除
HDEL [key] [field]
例如:
192.168.74.129:65511> hdel hash1 field1

4. 判断filed是否存在
HEXISTS [key] [field]
如果存在返回“1”,如果不存在返回“0”
例如:
192.168.74.129:65511> hexists hash1 field1

5. 取hash中的内容
从hash中取field的列表:
hkeys [key]
从hash中取value的列表
hvals [key]
从hash中取field和value的列表
hgetall [key]

3.List

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) 一个列表最多可以包含 2 ^32 - 1个元素 (4294967295, 每个列表超过40亿个元素)。
1. 添加元素
左边添加:lpush [key] [element…]
右边添加:rpush [key] [element…]

2. 取元素
左边取元素:lpop [key]
右边去元素:rpop [key]

3. 查看列表中元素
lrange [key] [start] [end]
需要设置列表中起始的元素的索引和结束元素的索引,如果结束元素的索引是 -1 则代表取到列表结尾。

4. 查看列表的长度
llen [key]

4.Set

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 2 ^32 - 1 (4294967295, 每个集合可存储40多亿个成员)。
1.添加元素
. sadd [key] [member…]

2. 删除元素
删除指定元素:srem [key] [member]
例如:
192.168.74.129:65511> srem set1 a

从集合中取移除随机元素:spop [key]
例如:
192.168.74.129:65511> spop set1

3. 取集合元素个数
scard [key]
192.168.74.129:65511> scard set1

4. 取集合元素成员
smembers [key]
192.168.74.129:65511> smembers set1

5.SortedSet

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 2^32 - 1(4294967295, 每个集合可存储40多亿个成员)。
由于SortedSet所有的命令都是以 Z 开头所以SortedSet也叫做 zset 。
1. 添加元素
zadd [key] [score] [member]

2. 删除元素
zrem [key] [member]

3. 元素数量
zcard [key]

4. 获取集合成员
zrange [key] [start] [stop] [withscroes]

更多操作链接

6.服务器命令

切换数据库:select [index]
如:
192.168.74.129:65511> select 1

查看当前数据库中的key:keys [partten]
如:
192.168.74.129:65511> keys *

删除key:del [key]
如:
192.168.74.129:65511> del a

查看key的数据类型:type [key]
如:
192.168.74.129:65511> type set1

查看key是否存在:exists [key]
如:
192.168.74.129:65511> exists a

设置key的生存时间:expire [key]
如:
192.168.74.129:65511> set a 1000

查看key多长时间过期:ttl [key]
如:
192.168.74.129:65511> ttl a

清空当前数据库中的数据:flushdb
删除所有数据库中的数据:flushall

持久化

Redis提供两种不同的持久化方式

  • RDB持久化会按照指定的时间间隔为数据创建快照并写入磁盘;
  • AOF持久化会记录服务器接收到的每一个写数据指令到文件中,这些指令将在服务器重启时进行重放,以此来重建原始数据,AOF产生的命令格格式与Redis本身的命令格式完全相同,并采用仅追加的方式,日志文件太大时,Redis会在后台重写日志;
  • 如果希望数据仅在Redis运行期间有效则可以完全禁用持久化来使效率最大化;

RDB快照

优点
  • RDB是表示某个时间点的非常紧凑的单个文件,RDB文件非常适合用于数据备份,例如(每天保存一次RDB),这可以在灾难发生后轻松地恢复数据;
  • RDB最大限度的保证了Redis的性能,因为父进程唯一要做的就是fork一个子进程去完成剩下的所有工作,父进程不会执行任何的I/O操作;
  • 与AOF相比,在数据量较大的情况下RDB能够更快的重启;
缺点
  • 丢失数据,如果希望将数据丢失的可能性(异常停止,断电)降到最低,则RDB不够好,虽然可以配置多个不同的保存点如:(5分钟后,1000次写操作后),通常是5分钟或更长时间后,但是Redis在这个保存点之前因为任何原因导致异常关闭,则将丢失最新的数据;
  • RDB需要经常的fork子进程才能将数据持久化到磁盘上,如果数据量很大,该过程可能很耗时,若数据量大且CPU性能不佳,则可能导致Redis停止响应客户端的请求几毫米甚至几秒,虽然AOF重写日志也需要fork子进程但是,你可以调整重写日志的频率;
配置

默认配置位于配置文件第287:

在这里插入图片描述
每个保存点第一个数字为时间间隔,第二个为写操作次数,当两个条件同时满足时则更新快照,频率高影响性能,太低则低丢失更多数据,需按照实际情况斟酌;

保存点可配置多个,如默认配置,更新快照的频率随着数据操作频率的增长而增长,可以尽可能的减少数据丢失,同时在数据操作频率低的时候,减少快照的更新操作;

AOF日志

优点
  • 使用AOF时Redis能提供更好的持久化,尽可能的减少数据丢失;可使用不同的fsync(文件同步)策略包括:完全没有fsync,每秒fsync,每个查询fsync。使用默认策略时(每秒),每秒的写入性能仍然很好;
  • AOF日志是仅追加的日志,即时断点也不会损坏文件,即时由于某种原因以外停止,导致写入了残缺的指令,redis-check-aof工具也能修复日志文件;
  • AOF文件过大时,Redis会在后台重写AOF,重写是安全的,Redis会继续追加操作指令到旧的文件,同时根据当前数据生成重建所需的最精简指令;等第二个文件准备好后Redis会切换至新的日志文件并开始追加到新文件;
  • AOF文件的指令格式非常简单,可以轻松的导出AOF,就像导出sql一样简单,这样你可以轻松的通过AOF文件恢复数据,例如错误的执行了删除所有数据的指令,只要重写操作没有触发,只需要删除最后的语句重新启动Redis;
缺点
  • 对于同样的数据,AOF文件通常大于等效的RDB文件。
  • 根据具体的fsync策略,AOF可能比RDB慢。(通常,在将fsync设置为*每秒的情况下,*性能仍然很高,在禁用fsync的情况下,即使在高负载下,它也与RDB一样快) 虽然如此,在巨大的写负载的情况下,RDB仍然能够尽可能保证最大延迟。
配置

启用AOF: 默认情况下AOF是禁用的,配置文件第1038行,将no修改为yes

#appendonly no
appendonly yes

文件同步策略,配置文件1067行

appendfsync always   #每执行一个写操作立马写入文件并完成磁盘同步
appendfsync everysec #每隔一秒将写操作写入文件并完成磁盘同步
appendfsync no #将写操作指令写入后,等待操作系统自动完成磁盘同步

AOF文件重写配置,配置文件1110行:

auto-aof-rewrite-percentage 100 #达到原始文件多少比例
auto-aof-rewrite-min-size 64mb #最小重写大小

AOF文件不完整(写入过程中意外关闭)时是否允许启动,配置文件1135行

aof-load-truncated yes

通常情况下AOF完整度是比RDB高的,所以重启后读取文件时,AOF优先于RDB;

另外当你对配置文件非常熟悉时完全可以创建一个空文件,添加需要修改的配置即可;

链接Redis进阶-主从,哨兵,集群

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值