Redis原理及基本应用

CAP定理:

C:Consistency 一致性,分布式系统中数据备份节点都需要实时保持数据一致性;

A:Availability 可用性,集群中有节点发生故障,并不影响整个集群对外提供服务;

P:Partition tolerance 分区容错性,系统数据部分丢失后,仍能提供服务。

在一个分布式系统中,CAP三者不能兼得;高可用、数据一致是很多系统设计的目标,但是分区的现象是不可避免的事情:

CA:分区的现象是始终存在的,一般得CA系统指的是在各分区后的子分区内保持CA;

CP:系统保持强一致性,在同步各节点之间数据中,无法做到多外提供服务,在关系型数据库事务中,就能体现CP的特性;

AP:保证高可用,就必须放弃强一致性。一旦集群中发生分区现象,每个节点都能使用自己的本地数据对外提供服务,但是这样会导致全局数据的不一致性,NoSQL都基本数据此特性。

由于网络硬件等问题,造成延迟丢包的现象肯定会发生,所以分区容忍性是我们必须要实现的。在设计分布式系统中,只能在一致性和可用性之间做权衡。

BASE方案:

BA(Basically Available)
基本可用,分布式系统出现故障时,允许损失部分可用性,保证核心可用;

S(Soft
state) 软状态,指允许系统出现中间状态,不会影响系统整体可用性;

E(Eventually consistent)
最终一致,系统中所有数据副本经过一段时间后,最终能够达到一致的状态。

NoSQL主要的四种技术流派:

K/V存储:key-value,如Dynamo、Redis;

Column Family:列式数据库,如HBase;

Document:文档数据库,如mongoDB;

GraphDB:图式数据库。

Redis:Remote DICtionary
Server:数据结构服务器。

Redis的特点:

(1) 完全开源免费,遵守BSD协议;

(2) 支持数据持久化存储;

(3) 支持数据备份。

Redis的优势:

(1) 性能高— 110000次/s的读速度,81000次/s的写速度;

(2) 支持的数据类型多— 有字符串(String),哈希(Hash),列表(List),集合(Sets),有序集合(Sorted sets)等类型的值。

(3) 原子性— 所有的操作都是原子性的;

(4) 特性丰富— 支持publish/subscribe、通知、key过期等特性。

Redis安装:3.0以上版本,需要到官网下载rpm包。

安装Redis的rpm包需要依赖到jemalloc安装包,所以需要配置好epel的yum源:

yum install ./redis-3.2.3-1.el7.x86_64.rpm

Redis配置:

Redis的配置文件为/etc/redis.conf,默认的监听端口为TCP的6379,通过rediscli可以登录交互式命令行界面:

[[email protected] ~]# systemctl start
redis.service

[[email protected] ~]# redis-cli

127.0.0.1:6379>

Redis数据类型:

Redis支持五中数据类型:字符串(String),哈希(Hash),列表(List),集合(Sets),有序集合 (Sorted sets)。

(1) 字符串(String)

127.0.0.1:6379> SET name ‘hisen‘    
#设置一个字符串的key为name,value为hisen

OK                                   #设置结果状态为OK

127.0.0.1:6379> GET name             #获取key为name的值

"hisen"                              #获取的结果

注意:一个键最大能存储512MB。

(2) 哈希(Hash)

Hash类型为一键多值型,一个键对应一个集合的值,命令HMSET、HGETALL。

127.0.0.1:6379>
HMSET hisen id name age gender

OK

127.0.0.1:6379>
HGETALL hisen

1)
"id"

2)
"name"

3)
"age"

4)
"gender"

每个hash可以存储2^32-1个键值对。

(3) 列表(List)

列表类型值,可以从左边或者右边加入字符串列表中,命令LPUSH、RPUSH、LRANGE:

127.0.0.1:6379>
LPUSH friends he

(integer)
1

127.0.0.1:6379>
LPUSH friends tao

(integer)
2

127.0.0.1:6379>
LPUSH friends ying

(integer)
3

127.0.0.1:6379>
RPUSH friends yu

(integer)
4

127.0.0.1:6379>
RPUSH friends zhen

(integer)
5

127.0.0.1:6379>
LRANGE friends 0 4

1)
"ying"

2)
"tao"

3)
"he"

4)
"yu"

5)
"zhen"

每个列表最多可存储2^32-1个元素。

(4) 集合(Sets)

Set是string类型的无序集合,命令SADD 、SMEMBERS。

添加一个String元素,成功返回1,如果插入的元素与集合中某元素相同,则返回0。

127.0.0.1:6379>
SADD animals cat

(integer)
1

127.0.0.1:6379>
SADD animals pig

(integer)
1

127.0.0.1:6379>
SADD animals dog

(integer)
1

127.0.0.1:6379>
SADD animals panda

(integer)
1

127.0.0.1:6379>
SADD animals dog

(integer)
0

127.0.0.1:6379>
SMEMBERS animals

1)
"pig"

2)
"panda"

3)
"cat"

4)
"dog"

(5) ZSET 有序集合 (Sorted sets)

ZSET也是string类型元素集合,而且不重复;

每个元素加入集合中时都会关联一个double类型的分数,Redis就是通过分数来对集合元素进行从大到小的排序,分数可以相同。

127.0.0.1:6379>
ZADD animals 0 pig

(integer)
1

127.0.0.1:6379>
ZADD animals 2 cat

(integer)
1

127.0.0.1:6379>
ZADD animals 4 dog

(integer)
1

127.0.0.1:6379>
ZADD animals 6 panda

(integer)
1

127.0.0.1:6379>
ZRANGEBYSCORE animals 0 10

1)
"pig"

2)
"cat"

3)
"dog"

4)
"panda"

Redis 配置:

Redis的配置文件为安装目录下的redis.conf文件,也可以通过命令行来查看:

127.0.0.1:6379>
CONFIG GET *

1) "dbfilename"

2) "dump.rdb"

3) "requirepass"

4) "hisen"

5) "masterauth"

6) ""

7) "unixsocket"

8) ""

9) "logfile"

10) "/var/log/redis/redis.log"

11) "pidfile"

12) "/var/run/redis/redis.pid"

13) "slave-announce-ip"

14) ""

15) "maxmemory"

16) "0"

17) "maxmemory-samples"

18) "5"

19) "timeout"

20) "0"

21) "auto-aof-rewrite-percentage"

22) "100"

23) "auto-aof-rewrite-min-size"

24) "67108864"

25) "hash-max-ziplist-entries"

26) "512"

27) "hash-max-ziplist-value"

28) "64"

29) "list-max-ziplist-size"

30) "-2"

31) "list-compress-depth"

32) "0"

redis.conf
配置文件项:

bind 0.0.0.0   
#监听端口

protected-mode yes

port 6379    #默认监听端口

tcp-backlog 511

timeout 0    #超时时间,0为不超时

tcp-keepalive
300

daemonize no   
#是否以守护方式运行

supervised
no

pidfile /var/run/redis/redis.pid 
#存放pid的文件

loglevel notice   
#日志记录级别:debug、verbose、notice、warning

logfile /var/log/redis/redis.log 
#日志存放的文件

databases 16   
#数据库数量

save 900 1    #指定900s内,有1次更新,就将数据同步到磁盘文件中

save 300 10  
#指定300s内,有10次更新,就将数据同步到磁盘文件中

save 60 10000   
#指定60s内,有10000次更新,就将数据同步到磁盘文件中

stop-writes-on-bgsave-error
yes

rdbcompression yes    
#本地数据是否压缩

rdbchecksum
yes

dbfilename dump.rdb   
#本地数据库名,默认为dump.rdb

dir /var/lib/redis      
#本地数据库存放路径

slaveof <masterip>
<masterport>  #本机为slave时,指定的master地址及端口号

masterauth <master-password> 
#slave连接master的密码

slave-serve-stale-data
yes

slave-read-only
yes

repl-diskless-sync
no

repl-diskless-sync-delay
5

repl-disable-tcp-nodelay
no

slave-priority
100

requirepass foobared   
#设置redis连接密码

maxclients 10000  
#同一时间最大客户端连接数

maxmemory <bytes>  
#指定redis最大可使用内存空间

appendonly no  
#指定是否在每次更新操作后进行日志记录

appendfilename
"appendonly.aof"   #更新日志文件名

appendfsync everysec  
#指定更新日志条件:no表示等操作系统进行数据缓存同步到磁盘;always每次更新操作后手动低啊用fsync()将数据写进磁盘;everysec每秒同步一次

no-appendfsync-on-rewrite
no

auto-aof-rewrite-percentage
100

auto-aof-rewrite-min-size
64mb

aof-load-truncated
yes

lua-time-limit
5000

slowlog-log-slower-than
10000

slowlog-max-len
128

latency-monitor-threshold
0

notify-keyspace-events
""

hash-max-ziplist-entries 512

hash-max-ziplist-value
64

list-max-ziplist-size
-2

list-compress-depth
0

set-max-intset-entries
512

zset-max-ziplist-entries
128

zset-max-ziplist-value
64

hll-sparse-max-bytes
3000

activerehashing
yes

client-output-buffer-limit
normal 0 0 0

client-output-buffer-limit
slave 256mb 64mb 60

client-output-buffer-limit
pubsub 32mb 8mb 60

hz
10

aof-rewrite-incremental-fsync
yes

Redis 发布订阅

Redis
发布订阅分为发送消息端(pub),接收信息端(sub)。

示例:

(1) 创建一个订阅频道WeChat:

127.0.0.1:6379>
SUBSCRIBE WeChat

Reading
messages... (press Ctrl-C to quit)

1)
"subscribe"

2)
"WeChat"

3)
(integer) 1

(2)
另外开启一个客户端,并对WeChat频道进行信息发布:

127.0.0.1:6379>
PUBLISH WeChat "Today is a funny day!"

(integer)
1

127.0.0.1:6379>
PUBLISH WeChat "I Love Linux!"

(integer)
1

(3) 返回订阅客户端查看:

127.0.0.1:6379>
SUBSCRIBE WeChat

Reading
messages... (press Ctrl-C to quit)

1)
"subscribe"

2)
"WeChat"

3)
(integer) 1

1)
"message"

2)
"WeChat"

3)
"Today is a funny day!"

1)
"message"

2)
"WeChat"

3)
"I Love Linux!"


命令


描述


PSUBSCRIBE pattern
 [pattern ...]


订阅一个或多个符合模式的频道


PUBSUB subcommand
 [argument [argument ...]]


查看订阅与发布系统状态


PUBLISH channel message


将信息发送给指定频道


PUNSUBSCRIBE [pattern
 [pattern ...]]


退订所有给定模式的频道


SUBSCRIBE channel
 [channel ...]


订阅给定的一个或多个频道信息


UNSUBSCRIBE [channel
 [channel ...]]


退订给定的频道

Redis 事务:

事务隔离性:一个事务中的所有命令都会按顺序执行,执行事务时不会被其他客户端发来的命令打断;

事务原子性:事务中的命令,要么全部执行,要么全部不执行。

示例:

MULTI是开启一个事务的标识,之后多个命令会在事务中列队,等执行EXEC时,列队中的所有命令再依次执行。

127.0.0.1:6379>
MULTI

OK

127.0.0.1:6379>
SET name hisen

QUEUED

127.0.0.1:6379>
GET name

QUEUED

127.0.0.1:6379>
SADD xingshi zhao qiao sun li

QUEUED

127.0.0.1:6379>
SMEMBERS xingshi

QUEUED

127.0.0.1:6379>
EXEC

1)
OK

2)
"hisen"

3)
(integer) 4

4)
1) "qiao"

2) "li"

3) "sun"

4) "zhao"


命令


描述


DISCARD


取消事务


EXEC


执行事务


MULTI


开始一个事务


UNWATCH


取消对所有key的监控


WATCH key [key ...]


监控key,如果在事务执行前key被更改,事务将会被打断

Redis
安全:

设置服务连接密码,可以通过配置文件,也可以通过命令行设置:

(1)查看Redis是否启用密码验证:

127.0.0.1:6379>
CONFIG GET requirepass

1)
"requirepass"

2) ""                    #空字符串代表没设置验证密码

(2)设置Redis密码验证:

127.0.0.1:6379> CONFIG SET
requirepass "hisen"     #设置密码为hisen

OK

127.0.0.1:6379> CONFIG GET
requirepass             #查看密码

1)
"requirepass"

2) "hisen"                                         #密码已设置,为hisen

(3)验证密码有效性:

127.0.0.1:6379> GET name                     #没输密码前,试图获取数据

(error) NOAUTH Authentication required.      #显示没有认证的错误

127.0.0.1:6379> AUTH hisen                   #输入认证密码

OK                                           #状态为OK

127.0.0.1:6379> GET name                     #再次获取数据

"hisen"                                      #正确返回数据

Redis
性能测试工具之redis-benchmark

redis-benchmark [option] [option value]

redis-benchmark选项:


选项


描述


默认值


-h


指定主机名


127.0.0.1


-p


指定端口


6379


-s


服务器socket


-c


并发连接数


50


-n


请求数


10000


-d


以字节的形式指定SET/GET值的数据大小


2


-k


1=keep
 alive    0=reconnect


1


-r


SET/GET/INCR使用随机key,SADD使用随机值


-P


通过管道传输<numreq>请求


1


-q


强制退出redis。仅显示query/sec值


--csv


以CSV格式输出


-l


生成循环,永久执行测试


-t


仅运行以逗号分隔的测试命令列表


-l


ldle模式,仅打开N个idle连接并等待


-a


指定认证密码


-dbnum


选择数据库号


0


-e


标准输出server回复的错误信息

示例:

[[email protected]
~]# redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -c 100 -n 10000

======
SET ======

10000 requests completed in 0.07 seconds

100 parallel clients

3 bytes payload

keep alive: 1

98.23%
<= 1 milliseconds

100.00%
<= 1 milliseconds

147058.81
requests per second

======
LPUSH ======

10000 requests completed in 0.07 seconds

100 parallel clients

3 bytes payload

keep alive: 1

99.51%
<= 1 milliseconds

100.00%
<= 1 milliseconds

147058.81
requests per second

[[email protected]
~]# redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -c 100 -n 10000 -q

SET:
144927.55 requests per second

LPUSH:
151515.16 requests per second

时间: 2024-08-27 03:56:02

Redis原理及基本应用的相关文章

Redis原理与实践总结

Redis原理与实践总结 本文主要对Redis的设计和实现原理做了一个介绍很总结,有些东西我也介绍的不是很详细准确,尽量在自己的理解范围内把一些知识点和关键性技术做一个描述.如有错误,还望见谅,欢迎指出. 这篇文章主要还是参考我之前的技术专栏总结而来的.欢迎查看: 重新学习Redis https://blog.csdn.net/column/details/21877.html 使用和基础数据结构(外观) redis的基本使用方式是建立在redis提供的数据结构上的. 字符串 REDIS_STR

Redis原理篇

Redis原理篇 1.发布 订阅模式 1.1列表 的局限 ? 前面我们说通过队列的 rpush 和 lpop 可以实现消息队列(队尾进队头出),但是消费者需要不停地调用 lpop 查看 List 中是否有等待处理的消息(比如写一个 while 循环).为了减少通信的消耗,可以 sleep()一段时间再消费,但是会有两个问题: 1.如果生产者生产消息的速度远大于消费者消费消息的速度,List 会占用大量的内存. 2.消息的实时性降低. list 还提供了一个阻塞的命令:blpop,没有任何元素可以

Redis 系列(04-2)Redis原理 - 内存回收

目录 Redis 系列(04-2)Redis原理 - 内存回收 Redis 系列目录 1. 过期策略 1.1 定时过期(主动淘汰) 1.2 惰性过期(被动淘汰) 1.3 定期过期 2. 淘汰策略 2.1 最大内存设置 2.2 淘汰策略 2.4 LFU Redis 系列(04-2)Redis原理 - 内存回收 Redis 系列目录 相关文档推荐: Redis - LRU Reids 所有的数据都是存储在内存中的,在某些情况下需要对占用的内存空间进行回收.内存回收主要分为两类,一类是 key 过期,

Redis原理详解

Redis原理详解 数据类型 Redis最为常用的数据类型主要有以下五种: String Hash List Set Sorted set 在具体描述这几种数据类型之前,我们先通过一张图了解下Redis内部内存管理中是如何描述这些不同数据类型的: 首先Redis内部使用一个redisObject对象来表示所有的key和value,redisObject最主要的信息如上图所示:type 代表一个value对象具体是何种数据类型,encoding是不同数据类型在redis内部的存储方式,比如:typ

memcache、redis原理对比

一.问题: 数据库表数据量极大(千万条),要求让服务器更加快速地响应用户的需求. 二.解决方案: 1.通过高速服务器Cache缓存数据库数据 2.内存数据库 (这里仅从数据缓存方面考虑,当然,后期可以采用Hadoop+HBase+Hive等分布式存储分析平台) 三.主流解Cache和数据库对比: 上述技术基本上代表了当今在数据存储方面所有的实现方案,其中主要涉及到了普通关系型数据库(MySQL/PostgreSQL),NoSQL数据库(MongoDB),内存数据库(Redis),内存Cache(

redis原理

1.什么是redis? Redis 是一个基于内存的高性能key-value数据库. 2.Reids的特点 Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存.因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性 能最快的Key-Value DB. Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个va

Redis 原理

线程IO模型 Redis 是个单线程程序!(对外网络请求服务) 对于那些时间复杂度为 O(n) 级别的指令,一定要谨慎使用,一不小心就可能会导致 Redis 卡顿. 使用缓冲区,事件轮询 API(Linux操作系统提供的select,poll,epoll),非阻塞 IO(能读多少读多少,能写多少写多少,读方法和写方法都会通过返回值来告知程序实际读写了多少字节). 注:epoll无须遍历整个被侦听的描述符集(fd),只要遍历那些被内核IO事件异步唤醒的描述符集合,select与poll是全轮询.

redis分布式锁原理

举例子:秒杀方式看医生,一个人看5min 1.第一次只允许一个人直接进行来,X10:00:00进去了,setNX(roomid,now+5min),出来时间假如是10:05:00 2.时间到了10:05:00,3个人同时进来,需要去看墙上的钟表,一个人一个的看 A进入病房看到,看到钟表时间10:05:00,得到时间10:05:00,看完时候的时间是10:05:01 B进入病房看到,看到钟表时间10:05:01,得到时间10:05:01,看完时候的时间是10:05:02 C进入病房看到,看到钟表时

redis入门

redis是什么 对于redis是什么的问题,比较好回答,它就是一个非关系型数据库,一个NoSql数据库.但是架构着对于redis的定位不同,决定了它在系统中会担任不同的角色.因为它的存储数据模型是Key-Value的模式,所以有的系统就作为一个存储的系统来使用.另外redis的数据存在内存中,有的项目就将redis作为一个高速缓存来使用.因为放在内存中的数据的读取肯定是要比硬盘上(其他关系型数据库都是写在磁盘上的)读写速度快. redis的适用场合 1.redis服务器直接作为数据库使用,应用