Redis使用介绍

目录:

1 Redis初识

     1.1 Redis介绍

     1.2 Redis功能特性介绍

     1.3 Redis使用场景

2 Redis下载及安装

     2.1下载安装

     2.2 Redis三种启动方式

     2.3 Redis常用配置

3 Redis命令

     3.1 全局命令

     3.2 Redis的五种数据结构的常用命令

4 Redis功能

     4.1 慢查询

     4.2 Pipeline

     4.3 发布订阅

     4.4 Bitmaps

     4.5 Hyperloglog

     4.6 Geo

     4.7 Lua与事务

5 Redis持久化

     5.1 RDB

     5.2 AOF

6 Redis客户端

7 用好Redis的建议


1 Redis初识

1.1 Redis介绍

           Redis是一种基于键值对(key-value)的NoSql数据库,与很多键值对数据库不同的是,Redis中的值可以是由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,因此Redis可以满足很多的应用场景,而且因为Redis会将所有数据放在内存中,所以它的读写性能非常惊人。不仅如此,Redis还可以将内存的数据利用快照和日志的形式保存到硬盘上,这样发生类似断电或者机器故障的时候内存中的数据不会“丢失”。除了上述功能以外,Redis还提供了键过期、发布订阅、事务、流水线、Lua脚本等附加功能。总之,如果在合适的场景使用好Redis,它就会想一把瑞士军刀一样所向披靡。

           2008年,Redis的作者Salvatore Sanfilippo在开发一个叫LLOOGG的网站时,需要实现一个高性能的队列功能,最开始是使用MySQL来实现的,但后来发现无论怎么优化SQL语句都不能使网站的性能提高上去,再加上自己囊中羞涩,于是他决定自己做一个专属于LLOOGG的数据库,这个就是Redis的前身。后来,Salvatore Sanfilippo将Redis1.0的源码开放到GitHub[3]上,可能连他自己都没想到,Redis后来如此受欢迎。

1.2 Redis功能特性

速度快

基于键值对的数据结构服务器

丰富的功能(键过期功能,发布订阅,支持Lua脚步,简单的事务,流水线Pipeline功能)

简单稳定

客户端语言多

持久化

主从复制

高可用和分布式

1.3 Redis使用场景

缓存

排行榜系统

计数器应用

社交网络

消息队列系统

2 Redis下载及安装

2.1 根据官方文档给出的步骤:

      安装

      下载、解压、编译Redis

$ wget http://download.redis.io/releases/redis-5.0.4.tar.gz

      $ tar xzf redis-5.0.4.tar.gz $ cd redis-5.0.4

      $ make

当前Redis的最新稳定版本是5.0.4,下载地址:http://www.redis.cn/download.html

2.2 Redis的三种启动方式

最简启动; redis-server

动态参数启动;redis-server --port 6380

配置文件启动;redis-server configPath(推荐)生产环境选择配置启动,因为直接启动无法自定义配置。单机多实例配置文件可以用端口区分开。

2.3 Redis常用配置

      redis.conf 配置项说明如下:

daemonize no【Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程

pidfile /var/run/redis.pid【当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定

port 6379【指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字

bind 127.0.0.1【绑定的主机地址

timeout 300【当 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能

loglevel verbose【指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose

logfile stdout 【日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null

databases 16【设置数据库的数量,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id

save <seconds> <changes>【指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合

rdbcompression yes【指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大

dbfilename dump.rdb【指定本地数据库文件名,默认值为dump.rdb

dir ./【指定本地数据库存放目录

slaveof <masterip> <masterport>【设置当本机为slave服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步

masterauth <master-password>【设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步

requirepass foobared【设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH 命令提供密码,默认关闭

maxclients 128设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息

maxmemory <bytes>【指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区

appendonly no【指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no

appendfilename appendonly.aof【指定更新日志文件名,默认为appendonly.aof

appendfsync everysec【指定更新日志条件,共有3个可选值: :表示等操作系统进行数据缓存同步到磁盘(快) ;:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) ;:表示每秒同步一次(折衷,默认值)

vm-enabled no指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)

vm-swap-file /tmp/redis.swap虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享

vm-max-memory 0【将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0

vm-page-size 32【Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值

vm-pages 134217728【设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存

vm-max-threads 4【设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4

glueoutputbuf yes【设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启

hash-max-zipmap-entries 64/hash-max-zipmap-value 512【指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法

activerehashing yes【指定是否激活重置哈希,默认为开启(后面在介绍Redis的哈希算法时具体介绍)

include /path/to/local.conf【指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件

3 Redis命令介绍

3.1 全局命令

查看所有键 keys*

键总数 dbsize(在计算总数时不会遍历所有键,而是直接获取Redis内置的键总数变量)

检查键是否存在 exists key 存在返回1,不存在返回0

删除键 del key [key...] (del是一个通用命令,无论值是什么数据结构类型,del命令都可以将其删除)

键过期 expire key seconds (ttl命令可以查看键的剩余过期时间,它有3种返回值:大于等于0的整数:键剩余过期时间。-1:键没设置过期时间。-2:键不存在)

键的数据结构类型 type key (如果键不存在返回none)

3.2 Redis的五种数据结构的常用命令


Redis的5中数据结构

3.2.1字符串

       字符串类型是Redis最基础的数据结构。首先键都是字符串类型,而且其他几种数据结构都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的学习奠定基础。字符串类型的值实际可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512MB.

如图:字符串数据结构


设置值 set key value[ex seconds][px milliseconds][nx][xx]

ex seconds:为设置秒级过期时间。同命令setex key seconds value

px milliseconds:为键设置毫秒级过期时间。

nx:键必须不存在,才可以设置成功,用于添加。setnx key value

xx:与nx相反,键必须存在,才可以设置成功,用于更新。

获取值 get key 如果键不存在,则返回空

批量设置值 mset key value [key value...]

批量获取值 mget key [key...] 如果有限键的值不存在,那么它的值为空,结果是按照传入键的顺序返回

计数 incr key 用于对值做自增操作,返回结果分为三种情况:

值不是整数,返回错误。

值是整数,返回自增后的结果。

键不存在,按照值为0自增,返回结果为1.

自减 decr key

incrby key increment自增指定数字

decrby key decrement自减指定数字

incrbyfloat key increment自增浮点数

字符串长度 strlen key

字符串类型命令时间复杂度


3.2.2 哈希

        几乎所有的编程语言都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组。在Redis中,哈希类型是指键本身又是一个键值对结构,形如value={{field1,value1}...{fieldN,valueN}},Redis键值对和哈希类型二者的关系可以用如下图来表示。


设置值  hset key field value 如果设置成功会返回1,反之会返回0.

获取值 hget key field如果键或field不存在,会返回空

删除field hdel ky field [field...] hdel会删除一个或多个filed,返回结果为成功删除field的个数。

计算filed的个数 hlen key

批量设置或获取filed-value hmget key filed [field...]  hmset key field value [field value...]

判断field是否存在 hexists key field 存在是返回1,不存在返回0

获取所有的field hkeys key 

获取所有value hvals key

获取所有的field value hgetall key

hincrby key field hincrbyfloat key field 和incrby incrbyfloat命令一样。

计算value的字符串长度 hstrlen key field

3.2.3 列表

        列表(list)类型是用来存储多个有序的字符串,如图2-18所示,a、b、c、d、e五个元素从左到右组成了一个有序的列表,列表中的每个字符串称为元素(element),一个列表最多可以存储232-1个元素。在Redis中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等(如图2-18和图2-19所示)。列表是一种比较灵活的数据结构,它可以充当栈和队列的角色,在实际开发上有很多应用场景。

列表两端插入和弹出


子列表获取、删除


特点

列表中的元素是有序的

列表中的元素是可以重复的

命令

添加操作

(1)从右边插入元素 rpush key value [value...]

(2)从左边插入元素 lpush key value [value...]

(3)向某个元素前或者后插入元素 linsert key before|after pivot value linsert命令会从列表中找到等于pivot的元素,在其前(before)或者后(after)插入一个新的元素value

查询

(1)获取指定范围内的元素列表 lrange key start end lrange 操作会获取列表指定索引范围所有的元素

索引下标有两个特点

a.索引下标从左到右分别是0到N-1,但是从右到左分别是-1到-N。

b.lrange中的end选项包含了自身,这个和很多编程语言不包含end不太相同

(2)获取列表指定索引下标的元素 lindex  key index

(3)获取列表长度 llen key

删除

(1)从列表左侧弹出元素 lpop key

(2)从列表右侧弹出元素 rpop key

(3)删除指定元素 lrem key count value lrem命令会从列表中找到等于value的元素进行删除,

根据count的不同分为三种情况:

a.count>o,从左到右,删除最多count个元素;

b.count<0,从右到左,删除最多count绝对值个元素;

c.count=0,删除所有

(4)按照索引范围修剪列表 ltrim key start end

修改 修改指定索引下标的元素:lset key index newValue

阻塞操作

blpop key [key...] timeout

brop key [key...] timeout

blpop和brpop是lpop和rpop的阻塞版本,key [key...]:多个列表的键。timeout:阻塞时间单位秒。

1)列表为空:如果timeout=3,那么客户端要等到3秒后返回,如果timeout=0,那么客户端一直阻塞等下去,如果在此期间添加了数据element1,客户端立即返回;

2)列表不为空:客户端会立即返回。

3.2.4 集合

       集合(set)类型也是用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。


命令

集合内操作

(1)添加元素 sadd key element [element...]返回结果为添加成功的元素个数

(2)删除元素 srem key element [element...] 返回结果为删除成的元素个数

(3)计算元素个数 scard key

(4)判断元素是否存在集合中 sismemeber key element 如果给定元素element在集合内返回1,反之返回0.

(5)随机从集合返回指定个数元素 srandmember key [count] [count]是可选参数,如果不写默认为1

(6)从集合随机弹出元素 spop key [count] spop操作可以从集合中随机弹出一个元素。

(7)获取所有元素 smembers key

集合间操作

(1)求多个集合的交集 sinter key [key ...]

(2)求多个集合的并集 sunion key [key...]

(3)求多个集合的差集 sdiff key [key...]


(4)将交集、并集、差集的结果保存

sinterstore destionation key [key...]

sunionstore destionation key [key...]

sdiffstore destionation key [key...]

3.2.5 有序集合

有序集合相对于哈希、列表、集合来说会有一点点陌生,但既然叫有序集合,那么它和集合必然有着联系,它保留和集合不能有重复成员的特性,但不同的是,有序集合中的元素可以排序。但是它和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个分数(score)作为排序的依据。

有序集合


列表、集合和有序集合的异同点


命令

集合内

(1)添加成员 zadd key score member [score memeber ...] 返回结果代表成功添加成员个数

注意点:

a.Redis3.2为zadd命令添加了 nx、xx、ch、incr四个选项:

nx:member必须不存在,才可以设置成功,用于添加

xx:member必须存在,才可以设置成功,用于更新

incr:对score做增加,相当于zincrby

b.有序集合相比较集合提供了排序字段,但是也产生了代价,时间复杂度为O(log(n))

(2)计算成员个数 zcard key

(3)计算某个成员的分数 zscore key member

(4)计算成员排名 zrank key member zrevrank key member zrank是从分数低到高返回排名,zrevrank反之。

(5)删除成员 zrem key member [member....] 返回结果为成功删除的个数。

(6)增加成员分数 zincrby key increment member

(7)返回指定排名范围的成员 zrange key start end [withscores] zrevrange key start end [withscores]

(8)返回指定分数范围的成员 zrangebyscore key min max [withscores] [limit offset count] zrevrangebyscore key max min [withscores] [limit offset count] 其中zrangebyscore按照分数从低到高返回zrevrangebyscore反之。同时min和max还支持开区间(小括号)和闭区间(中括号),-inf和+inf分别代表无限小和无限大

(9)返回指定分数范围的成员个数 zcount key min max

(10)删除指定排名的升序元素 zremrangebyrank key start end

(11)删除指定分数范围的成员 zrerangebyscore key min max

集合间的操作

(1)交集

zinterstore destionation numkeys key [key...][weights weight [weight..]][aggregate sum|min|max]

a.destionation :交集计算结果保存到这个键。

b.numkeys:需要做交集计算键个数。

c.key[key...]:需要做交集计算的键。

d.weights weight[weight...]:每个键的权重,在做交集计算时,每个键中的每个member会将自己的分数乘以这个权重,每个键的权重默认是1.

e.aggregate sum|min|max :计算成员交集后,分值可以按照sum(和)、min(最小值)、max(最大值)做汇总,默认值是sum。

(2)并集

zunionstore destion numkeys key [key...][weights weight [weight..]] [aggregate sum|min|max] 同上.

4 Redis功能

4.1 慢查询

       慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息记录下来。

Redis提供了slowlog-log-slower-than 和 slowlog-max-len 配置解决慢查询的问题。

4.2 Pipeline

       Pipeline是Redis提供的批量操作命令,有效节约RTT(命令执行往返时间)。执行n次命令的模型图如下


RTT在不同网络环境下会有不同,例如同机房和同机器会比较快,跨机房跨地区会比较慢。Redis命令真正执行的时间通常在微妙级别,所以才会有Redis性能瓶颈是网络这样的说法。

4.2.1 原生批量命令与Pipeline对比

原生批量命令是原子的,Pipeline是非原子的。

原生批量命令是一个命令对应多个key,Pipeline支持多个命令。

原生批量命令是Redis服务端支持实现的,而Pipeline需要服务端和客户端的共同实现。

4.3发布订阅

Redis提供了基于“发布/订阅”模式的消息机制,此种模式下,消息发布者和订阅者不进行直接通信,发布者客户端向指定频道(channel)发布消息,订阅该频道的每个客户端都可以收到该消息,如图:

Redis发布订阅模型


4.3.1 命令

发布消息 publish channel message

订阅消息 subscribe channel [channel ...] 新开启的订阅客户端,无法收到该频道之前的消息,因为Redis不会对发布的消息进行持久化。

取消订阅 unsubscribe channel [channel...]

按照模式订阅和取消订阅 psubscribe pattern [pattern..] punsubscribe [pattern [pattern...]]

查询订阅

(1)查看活跃的频道 pubsub channels [pattern]

(2)查看频道订阅数 pubsub numsub [channel...]

(3)查看模式订阅数 pubsub numpat

4.4 bitmap位图

Bitmaps本身不是一种数据结构,实际上它就是字符串,但是它可以对字符串的位进行操作。


4.4.1命令

设置值 setbit key offset value

获取值 getbit key offset

获取Bitmaps指定范围值为1的个数 bitcount [start][end] [start]和[end]代表起始和结束字节数。

Bitmaps间的运算 bitop op destkey key [key...] bitop 是个复合操作,它可以做多个Bitmaps的add(交集)、or(并集)、not(非)、xor(异或)操作并将结果保存在destKey中。

计算Bitmaps中第一个值为tagetBit的偏移量 bitops key tagetBit [start][end]

4.5 Hyperloglog

Hyperloglog 并不是一种新的数据结构(其本质还是字符串类型),而是一种基数算法,通过Hyperloglog可以利用极小的内存空间完成独立总数的统计

4.5.1 命令

添加 pfadd key element [element...]

计算独立用户数 pfcount key [key...]

合并 pfmerge destkey sourcekey [sourekey ...] pfmerge可以求出多个Hyperloglog的并集并赋值给destkey。

Hyperloglog内存占用量非常小,但是存在错误率,开发者在进行数据结构选型时只需要确认如下两条即可

只为了计算独立总数,不需要获取单条数据。

可以容忍一定误差率,毕竟Hyperloglog在内存的占用量上有很大的优势。

4.6 geo地理位置信息

Redis3.2版本提供了GEO功能,支持存储地理位置信息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能。

4.6.1命令

增加地理位置信息 geoadd key longitude latitude member [longitude latitude member...] longitude、latitude、member分别是该地理位置的经度、纬度、成员。

获取地理位置信息 geopos key member [member...]

获取两个地理位置的距离 geodist key member1 member2 [unit] 其中Unit代表返回结果的单位,包括以下四种:m代表米,km代表公里,mi代表英里,ft代表尺。

获取指定位置范围内的地理信息位置集合

georadius key longitude latitude radius m|km|ft|mi [withcoord][withlist][withhash] [COUNT count] [asc|desc] [store key] [storedist key]

georadiusbymember key member     radiusm|km|ft|mi [withcoord] [withdist]      [withhash] [COUNT count] [asc|desc] [store key] [storedist key]

georadius和georadiusbymember两个命令的作用是一样的,都是以一个地理位置为中心算出指定半径内的其他地理信息位置,不同的是georadius命令的中心位置给出了具体的经纬度,georadiusbymember只需给出成员即可。其中radiusm|km|ft|mi是必需参数,指定了半径(带单位),这两个命令有很多可选参数,如下所示:

withcoord:返回结果中包含经纬度。

withdist:返回结果中包含离中心节点位置的距离。

withhash:返回结果中包含geohash,有关geohash后面介绍。

count:指定返回结果的数量。

asc|desc:返回结果按照离中心节点的距离做升序或者降序。

store key:将返回结果的地理位置信息保存到指定键。

storedist key:将返回结果离中心节点的距离保存到指定键。

获取geohash geohash key member [member...] 

删除地理位置信息 zrem key member 

4.7 Lua与事务

4.7.1事务

Redis提供了简单的事务功能,将一组需要一起执行的命令放大multi和exec两个命令之间.multi命令代表事务开始,exec命令代表事务结束,它们之间的命令是原子顺序执行的。

如果要停止事务的执行,可以使用discard命令代替exec命令即可。

如果事务中的命令出现错误,Redis的处理机制也不尽相同。

命令错误 会导致整个事务无法执行。

运行时错误 因为语法是正确的所以无法终止,Redis也不支持回滚功能,需自行修复数据。

4.7.2 Lua脚本

Lua用法

数据类型及其逻辑处理 Lua语言提供了如下几种数据类型 :booleans、numbers、strings、tables。

(1)字符串 例:local strings val = "world",其中local代表val是一个局部变量,如果没有local代表是全局变量。“–”是Lua语言的注释。

(2)数组 在Lua中,下标从1开始计算,可以使用for和while遍历。

(3)哈希  如果要使用类似哈希的功能,可以使用tables类型代替。

函数定义

在Lua中,函数以function开头,以end结尾,funcName是函数名,中间部分是函数体:

function funcName()

...

end

contact 函数将两个字符串拼接:

function contact(str1,str2)

reurn str1..str2

end

--"hello world"

print(contact("hello","world"))

5 Redis持久化

Redis支持RDB和AOF两种持久化机制,持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。理解掌握持久化机制对于Redis运维非常重要。

5.1 RDB

5.1.1什么是RDB

RDB持久化是把当前进程数据生成快照保存到硬盘的过程。

5.1.2触发机制

save(同步)

bgsave(异步)

自动

5.1.3RDB的优缺点

优点

RDB是一个紧凑压缩的二进制文件,代表Redis在某个时间点上的数据快照。非常适用于备份,全量复制等场景。

Redis加载RDB恢复数据远远快于AOF的方式。

缺点

RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都要执行Fork操作创建原子进程,属于重量级操作,频繁执行成本过高。

RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个格式的RDB版本,存在老版本Redis服务无法兼容新版RDB格式的问题。

5.2 AOF

AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式。理解掌握好AOF持久化机制对我们兼顾数据安全性和性能非常有帮助。

5.2.1 使用AOF

开启AOF功能需要设置配置:appendonly yes,默认是不开启。AOF文件名通过appendfilename配置设置,默认文件名是appendonly.aof。保存路径同RDB持久化方式一致,通过dir配置指定。

AOF的工作流程操作:

命令写入:所有的写入命令会追加到aof_buf(缓冲区)中。

文件同步:AOF缓冲区恩就对应的策略向硬盘做同步操作。

文件重写:随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的。

重启加载:当Redis服务重启时,可以加载AOF文件进行数据恢复。

6 Redis客户端

Redis支持多种语言的客户端,比较常用的就是Java的客户端Jedis和Python客户端redis-py.

Java客户端

获取Jedis

          Jedis属于Java的第三方开发包,在Java中获取第三方开发包通常有两种方式:

          1)直接下载目标版本的jar包到项目中。

          2)使用集成构建工具,例如maven,gradle。

       2.Jedis的基本使用方法

         # 1. 生成一个Jedis对象,这个对象负责和指定Redis实例进行通信

         Jedis jedis = new Jedis("127.0.0.1", 6379);

         # 2. jedis执行set操作 jedis.set("hello", "world");

         # 3. jedis执行get操作, value="world"

         String value = jedis.get("hello");

       3.Jedis连接池的使用方法

        使用连接池对于频繁访问Redis的场景更高效。所有Jedis对象预先放在池子中,每次连接Redis,只需要在池子中借,用完了再归还给池子。


        参数配置:


7 用好Redis的建议

1.切勿当作黑盒使用,开发与运维同样重要

很多使用Redis的开发者认为只要会用API开发相应的功能就可以,不需要知道Redis的原理。但是在实际的使用中很多的Redis线上故障和问题都是由于完全把Redis当作黑盒造成的,如果不了解Redis的单线程模型有些开发者会在有上千万个键的Redis上执行key*操作,这个命令是很耗性能的。开发人员可以通过运维Redis真正了解Redis的一些原理,不单纯停留在开发上。

2.阅读源码

Redis是开源项目且代码量很小,我们可以通过阅读源码加深对Redis的理解,同时提供自身的编码水平,甚至可以对Redis做定制化。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • NOSQL类型简介键值对:会使用到一个哈希表,表中有一个特定的键和一个指针指向特定的数据,如redis,volde...
    MicoCube阅读 3,956评论 2 27
  • Redis是啥 Redis是一个开源的key-value存储系统,由于拥有丰富的数据结构,又被其作者戏称为数据结构...
    一凡呀阅读 1,170评论 0 5
  • 原帖地址:https://www.jianshu.com/p/2f14bc570563 redis概述 Redis...
    onlyHalfSoul阅读 2,154评论 0 28
  • Ubuntu下安装redis 安装redis 在 Ubuntu 系统安装 Redi 可以使用以下命令: 启动 Re...
    riverstation阅读 906评论 0 0
  • 1 Redis介绍1.1 什么是NoSql为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方...
    克鲁德李阅读 5,263评论 0 36