验证中...
10月20日,北京【人工智能】源创会火热报名中,点击报名收获 AI 训练指南
gistfile1.txt
原始数据 复制代码
1. 什么是Redis?
Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。 Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用它的List来做FIFO双向链表,实现一个轻量级的高性能消息队列服务,用它的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作功能加强版的memcached来用。 Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
2.Redis相比memcached有哪些优势?
(1) memcached所有的值均是简单的字符串,redis支持更为丰富的数据类型
(2) redis的速度比memcached快很多
(3) redis可以持久化其数据
3.Redis支持哪几种数据类型?
String、List、Set、Sorted Set、hashes
4.Redis主要消耗什么物理资源?
内存。
5.Redis的全称是什么?
Remote Dictionary Server。
6.Redis有哪几种数据淘汰策略?
noeviction:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)
allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
allkeys-random: 回收随机的键使得新添加的数据有空间存放。
volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。
7.Redis官方为什么不提供Windows版本?
因为目前Linux版本已经相当稳定,而且用户量很大,无需开发windows版本,反而会带来兼容性等问题。
8.字符串类型的值能存储最大容量是多少?
512M
9.为什么Redis需要把所有数据放到内存中?
Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以redis具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘I/O速度为严重影响redis的性能。在内存越来越便宜的今天,redis将会越来越受欢迎。如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。
10.Redis集群方案应该怎么做?都有哪些方案?
1.twemproxy,它类似于一个代理方式,使用方法和普通redis无任何区别,设置好它下属的多个redis实例后,使用时在本需要连接redis的地方改为连接twemproxy,它会以一个代理的身份接收请求并使用一致性hash算法,将请求转接到具体redis,将结果再返回twemproxy。使用方式简便(相对redis只需修改连接端口),对旧项目扩展的首选。 问题:twemproxy自身单端口实例的压力,使用一致性hash后,对redis节点数量改变时候的计算值的改变,数据无法自动移动到新的节点。
2.codis,目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在节点数量改变情况下,旧节点数据可恢复到新hash节点。
3.redis cluster3.0自带的集群,特点在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点设置从节点。具体看官方文档介绍。
4.在业务代码层实现,起几个毫无关联的redis实例,在代码层,对key 进行hash计算,然后去对应的redis实例操作数据。 这种方式对hash层代码要求比较高,考虑部分包括,节点失效后的替代算法方案,数据震荡后的自动脚本恢复,实例的监控,等等。
11.Redis集群方案什么情况下会导致整个集群不可用?
有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用。
12.MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?
redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。
13.Redis有哪些适合的场景
(1)会话缓存(Session Cache),商业平台Magento提供的Redis插件。
(2)全页缓存(FPC)
除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。
(3)队列
Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。
(4)排行榜/计数器
Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得在执行这些操作的时候变的非常简单:如果想返回用户及用户的分数,只需要执行如下操作即可:
ZRANGE user_scores 0 10 WITHSCORES
(5)发布/订阅
14.Redis支持的Java客户端都有哪些?官方推荐用哪个?
Redisson、Jedis、lettuce等等,官方推荐使用Redisson。
15.Redis和Redisson有什么关系?
Redisson是一个高级的分布式协调Redis客户端,能帮助用户在分布式环境中轻松实现一些Java的对象 (Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, AtomicLong, CountDownLatch, Publish / Subscribe, HyperLogLog)。
16.Jedis与Redisson对比有什么优缺点?
Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。
17.Redis如何设置密码及验证密码?
设置密码:config set requirepass 123456
授权密码:auth 123456
18.说说Redis哈希槽的概念?
Redis集群没有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。
19.Redis集群的主从复制模型是怎样的?
为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品.
20.Redis集群会有写操作丢失吗?为什么?
Redis并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作。
21.Redis集群之间是如何复制的?
异步复制
22.Redis集群最大节点个数是多少?
16384个。
23.Redis集群如何选择数据库?
Redis集群目前无法做数据库选择,默认在0数据库。
24.怎么测试Redis的连通性?
ping
25.Redis中的管道有什么用?
一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应。这样就可以将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。这就是管道(pipelining),是一种几十年来广泛使用的技术。例如许多POP3协议已经实现支持这个功能,大大加快了从服务器下载新邮件的过程。
26.怎么理解Redis事务?
事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其它客户端发送来的命令请求所打断。事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
27.Redis事务相关的命令有哪几个?
MULTI、EXEC、DISCARD、WATCH
28.Redis key的过期时间和永久有效分别怎么设置?
EXPIRE和PERSIST命令。
29.Redis如何做内存优化?
尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以应该尽可能的将你的数据模型抽象到一个散列表里面。比如web系统中的用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面.
30.Redis回收进程如何工作的?
客户端运行了新的命令,添加了新的数据,Redis会检查内存使用情况,如果大于maxmemory的限制, 则根据设定好的策略进行回收,新的命令被执行等等。所以不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。
31.Redis回收使用的是什么算法?
LRU算法
32.Redis如何做大量数据插入?
Redis2.6开始redis-cli支持一种新的被称之为pipe mode的新模式用于执行大量数据插入工作。
33.为什么要做Redis分区?
分区可以让Redis管理更大的内存,Redis将可以使用所有机器的内存。如果没有分区,你最多只能使用一台机器的内存。分区使Redis的计算能力通过简单地增加计算机得到成倍提升,Redis的网络带宽也会随着计算机和网卡的增加而成倍增长。
34.你知道有哪些Redis分区实现方案?
客户端分区就是在客户端就已经决定数据会被存储到哪个redis节点或者从哪个redis节点读取。大多数客户端已经实现了客户端分区。
代理分区意味着客户端将请求发送给代理,然后代理决定去哪个节点写数据或者读数据。代理根据分区规则决定请求哪些Redis实例,然后根据Redis的响应结果返回给客户端。redis和memcached的一种代理实现就是Twemproxy
查询路由(Query routing)的意思是客户端随机地请求任意一个redis实例,然后由Redis将请求转发给正确的Redis节点。Redis Cluster实现了一种混合形式的查询路由,但并不是直接将请求从一个redis节点转发到另一个redis节点,而是在客户端的帮助下直接redirected到正确的redis节点。
35.Redis分区有什么缺点?
涉及多个key的操作通常不会被支持。例如不能对两个集合求交集,因为它们可能被存储到不同的Redis实例(实际上这种情况也有办法,但是不能直接使用交集指令)。
同时操作多个key,则不能使用Redis事务.
分区使用的粒度是key,不能使用一个非常长的排序key存储一个数据集(The partitioning granularity is the key, so it is not possible to shard a dataset with a single huge key like a very big sorted set).
当使用分区的时候,数据处理会非常复杂,例如为了备份必须从不同的Redis实例和主机同时收集RDB / AOF文件。
分区时动态扩容或缩容可能非常复杂。Redis集群在运行时增加或者删除Redis节点,能做到最大程度对用户透明地数据再平衡,但其它一些客户端分区或者代理分区方法则不支持这种特性。然而,有一种预分片的技术也可以较好的解决这个问题。
36.Redis持久化数据和缓存怎么做扩容?
如果Redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。
如果Redis被当做一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化。否则的话(即Redis节点需要动态变化的情况),必须使用可以在运行时进行数据再平衡的一套系统,而当前只有Redis集群可以做到这样。
37.分布式Redis是前期做还是后期规模上来了再做好?为什么?
既然Redis是如此的轻量(单实例只使用1M内存),为防止以后的扩容,最好的办法就是一开始就启动较多实例。即便只有一台服务器,也可以一开始就让Redis以分布式的方式运行,使用分区,在同一台服务器上启动多个实例。一开始就多设置几个Redis实例,例如32或者64个实例,对大多数用户来说这操作起来可能比较麻烦,但是从长久来看做这点牺牲是值得的。这样的话,当你的数据不断增长,需要更多的Redis服务器时,需要做的就是仅仅将Redis实例从一台服务迁移到另外一台服务器而已(而不用考虑重新分区的问题)。一旦你添加了另一台服务器,你需要将你一半的Redis实例从第一台机器迁移到第二台机器。
38.Twemproxy是什么?
Twemproxy是Twitter维护的(缓存)代理系统,代理Memcached的ASCII协议和Redis协议。它是单线程程序,使用C语言编写,运行起来非常快。它是采用Apache 2.0 license的开源软件。Twemproxy支持自动分区,如果其代理的其中一个Redis节点不可用时,会自动将该节点排除(这将改变原来的keys-instances的映射关系,所以应该仅在把Redis当缓存时使用Twemproxy)。 Twemproxy本身不存在单点问题,因为可以启动多个Twemproxy实例,然后让客户端去连接任意一个Twemproxy实例。Twemproxy是Redis客户端和服务器端的一个中间层,由它来处理分区功能应该不算复杂,并且应该算比较可靠的。
39.支持一致性哈希的客户端有哪些?
Redis-rb、Predis等。
40.Redis与其它key-value存储有什么不同?
Redis有着更为复杂的数据结构并且提供对它们的原子性操作,这是一个不同于其它数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,应为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面它们是紧凑的以追加的方式产生的,因为它们并不需要进行随机访问。
41.Redis的内存占用情况怎么样?
Redis会记录类型信息引用计数等等。64位的系统比32位的需要更多的内存开销,尤其是键值对都较小时,这是因为64位的系统里指针占用了8个字节。 但是当然,64位系统支持更大的内存,所以为了运行大型的Redis服务器或多或少的需要使用64位的系统。
42.都有哪些办法可以降低Redis的内存使用情况呢?
如果使用的是32位的Redis实例,可以好好利用Hash,list,sorted set,set等集合类型数据,因为通常情况下很多小的Key-Value可以用更紧凑的方式存放到一起。
43.查看Redis使用情况及状态信息用什么命令?
info
44.Redis的内存用完了会发生什么?
如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回。)或者可以将Redis当缓存来使用配置淘汰机制,当Redis达到内存上限时会冲刷掉旧的内容。
45.Redis是单线程的,如何提高多核CPU的利用率?
可以在同一个服务器部署多个Redis的实例,并当作不同的服务器来使用,在某些时候,无论如何一个服务器是不够的, 所以,如果想使用多个CPU,可以考虑一下分片(shard)。
46.一个Redis实例最多能存放多少的keys?List、Set、Sorted Set它们最多能存放多少元素?
理论上Redis可以处理多达232的keys,并且在实际中进行了测试,每个实例至少存放了2亿5千万的keys。任何list、set、和sorted set都可以放232个元素。换句话说,Redis的存储极限是系统中的可用内存值。
47.Redis常见性能问题和解决方案?
(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件
(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内
(4) 尽量避免在压力很大的主库上增加从库
(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...
这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。
48.Redis提供了哪几种持久化方式?
RDB持久化方式能够在指定的时间间隔能对数据进行快照存储。AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大.
如果只希望数据在服务器运行的时候存在,也可以不使用任何持久化方式.也可以同时开启两种持久化方式, 在这种情况下, 当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整.
最重要的事情是了解RDB和AOF持久化方式的不同,让我们以RDB持久化方式开始。
49.如何选择合适的持久化方式?
一般来说, 如果想达到足以媲美PostgreSQL的数据安全性,应该同时使用两种持久化功能。如果非常关心数据,但仍然可以承受数分钟以内的数据丢失,那么可以只使用RDB持久化。
有很多用户都只使用AOF持久化,但并不推荐这种方式:因为定时生成RDB快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比AOF恢复的速度要快,除此之外, 使用RDB还可以避免之前提到的AOF程序的bug。
50.修改配置不重启Redis会实时生效吗?
针对运行实例,有许多配置选项可以通过 CONFIG SET 命令进行修改,而无需执行任何形式的重启。从Redis 2.2开始,可以从AOF切换到RDB的快照持久性或其它方式而不需要重启 Redis。检索 ‘CONFIG GET *’ 命令获取更多信息。但偶尔重新启动是必须的,如为升级 Redis 程序到新的版本,或者当需要修改某些目前 CONFIG 命令还不支持的配置参数的时候。
Redis开源的高性能键值对数据库
1.内存的设置
命令:maxmemory;
超过最大内存:OOM command not allowed when used memory >‘maxmemory;
过期策略的设置LRU(Least Recently Used):
(a)volatile-lru:根据LRU算法生成的过期时间来删除;
(b)allkeys-lru:根据LRU算法删除任何key;
(c)volatile-random:根据过期设置来随机删除key;
(d)allkeys-random:无差别随机删除;
(e)volatile-ttl(Time To Live):根据最近过期时间来删除(辅以TTL);
(f)noeviction:不删除任何Key,直接在写操作时返回错误。
2.存储结构(内存存储与刷盘,分布式缓存)
字符数据类型:可包含二进制数据,容量512M
散列类型
列表类型
集合类型
有序集合类型
3.版本约定
偶数是稳定版本;奇数是非稳定版本,奇数版本主要是发布新功能,为公测版本
4.权限的设置
修改redis.conf,添加requirepass password;
登入:auth password或者redis-cli -a password
5.Redis事务管理
提交事务:multi->事务操作queued->exec
取消事务:multi->事务操作queued->discard取消->exec(error)ERR EXEC without MULTI;
事务的上下文不保证原子性【待检验测试】;
Watch:数据版本,乐观锁,设置不成功会返回nil;
6.Redis基本命令
启动redis server:redis-server /etc/redis/redis.conf;
查看redis服务是否启动正常:netstat -lnap|grep 6379;
关闭Redis服务:redis-cli shutdown;
String设置与查询:set key value;get key;
状态回复:set key value=>OK;ping=>PONG;
错误回复:noexist=>(error)ERR unknown command 'noexist';
整数回复:incr(decr) age/incrby(decrby) age 2=>返回递增(递减)后对应的值;
incr(String类型等) blog.title =>(error)ERR value is not an integer or out of range;
字符串回复:get age=>27;get noexist=>(nil);
多字符串回复:keys *=>返回对应的所有key;
浮点数递增无递减:incrbyfloat money 3;
尾部追加:append existkey "append content"=>返回key长度;
获取字符串长度:strlen blog.title=>不存在的返回0,汉字UTF-8编码的长度为3;
多键值对操作:mset k1 v1 k2 v2;mget k1 k2;
位操作的命令(e和m之间总共有8个位值为1的个数):
GETBIT key offset
SETBIT key offset value
BITCOUNT key [start] [end]
BITOP operation destkey key [key ...]
Hash的赋值和取值:HSET/HSETNX HASHNAME FIELD VALUE;HGET HASHNAME FIELD;
获取所有Hash信息:HKEYS(empty list or set)/HVALS/HGETALL HASHNAME;
判断Hash信息是否存在(1,0):HEXISTS HASHNAME FIELD;
删除Hash字段:HDEL HASHNAME FIELD;
增加Hash数字:HINCRBY HASHNAME FIELD value((error) ERR hash value is not an integer);
获取Hash元素数量(1,0):HLEN HASHNAME;
批量Hash操作:
HMSET HASHNAME KEY1 VALUE1 [KEYn VALUEn....]
HMGET HASHNAME KEY1 KEY2....KEYN
增加List元素(可多值):LPUSH/RPUSH ListName value;
弹出List元素:LPOP/RPOP ListName;不存在值则返回(nil)
获取List元素个数:LLEN ListName
获取List列表片段:LRANGE ListName START END(START和END边界会返回,负数表示末尾)
删除List指定元素:
LREM KEY COUNT VALUE;
LREM命令会删除列表中前COUNT个值为VALUE的元素,返回值是实际删除的元素个数,根据COUNT值的不同,LREM命令的执行方式会有所不同;
当count>0时,LREM会从左边开始删除;
当count<0时,LREM会从右边开始删除;
当count=0时,LREM会删除所有值为VALUE的元素
获取/指定索引的元素值:LINDEX LISTNAME INDEX;LSET LISTNAME INDEX VALUE;
保留List指定片段(包含边界值),删除start end之外的元素,保留start end范围之内的元素:LTRIM ListName START END;
向列表中插入元素:LINSERT LISTNAME BEFORE|AFTER VALUE NEWVALUE;
列表数据拷贝:RPOPLPUSH SOURCE DESTATION;
增加Set元素:SADD SETNAME ELEMENT[ELEMENTN];
删除Set元素:SREM SETNAME ELEMENT[ELEMENTN];
获取Set所有元素:SMEMBERS SETNAME
判断Set元素是否存在(1,0):sismember SetName value;
集合间Set运算:sunion/ sinter/ sdiff SetName1 SetName2;
获取Set元素个数:SCARD SetName;
集合Set运算结果存储:SDIFFSTORE/SINTERSTORE/SUNIONSTORE SetName SetName1 SetName2
随机获取元素:SRANDMEMBER SETNAME [COUNT]
当count为正时获取count个不重复的元素,如果大于set个数则获取全部的数值;
当count为负时会随机获取|count|个元素的个数,但是元素的内容有可能是相同的;
增加ZSet元素:ZADD ZSETNAME SCORE ZNAME
获取ZSet元素的分数:ZSCORE ZSETNAME ELEMENT
获取ZSet范围类的列表:ZRANGE/ZREVRAGE ZSETNAME start end withscores
获取ZSet指定分数范围之内的元素列表:
ZRANGEBYSCORE ZSETNAME MIN MAX [ WITHSCORES] [LIMIT OFFSET COUNT];
增加ZSet某个元素的分数:ZINCRBY ZSETNAME INCREMENT MEMBER;
获取ZSet集合中元素的个数:zcard zsetname;
获取ZSet指定分数范围内的元素个数:zcount zset range(start end);
删除ZSet一个或多个元素:zrem zsetname value/range(start end);
按照ZSet排名范围删除元素:zremrangebyrank zsetname 0 -1;
按照ZSet分数范围删除元素:zremrangebyscore zsetname 5 9
获取ZSet元素的排名:ZRANK命令可以获取元素的排名信息,使用ZREVRANK可以逆向获取元素的排名:zrank/zrevrank zsetname elements;
计算ZSet有序集合的交集:ZINTERSTORE DESTINATION NUMKEYS KEY[KEY...][WEIGHTS WEIGHT [WEIGHT...]] [AGGREGATE SUM|MIN|MAX];DESTINATION中的元素是由AGGREGATE决定;
7.主从复制
(a)特点:
(a.1)一台Master有多个Slave;
(a.2)Slave不仅可以连接Master并且可以连接Slave;
(a.3)主从复制不会影响Master的性能,复制过程是异步进行的;
(b)主从同步过程:
(b.1)Slave与Master建立连接,发送sync同步命令;
(b.2)Master会启动一个后台进程,将数据快照保存在文件中,同时Master主进程启动新的守护进程继续收集命令;
(b.3)后台完成收集后,将文件同步给Slave;
(b.4)Slave会将文件保存在Redis服务器下。
8.持久化操作
(a)数据快照的方式,Redis的默认方式,内存中的数据文件写入二进制文件,文件格式一般为dump.rdb,save可设置保存策略
(b)追加文件的方式,AOF方式(Append only file),将文件按在一定的时间间隔存储在数据文件中,appendonly需改成yes;
9.发布与订阅
(a)首先某个客户端使用subscribe命令或者psubscribe命令监听某个通道(频道)
(b)然后服务端针对某个通道或者频道发送消息
(c)客户端接收消息
publish channelname msg;subscribe channel;
10.Redis虚拟内存
将Redis内存中不经常使用的数据存放到硬盘的一块空间中以减少内存的占有;
vm-enabled yes
# 开启vm功能
vm-swap-file /tmp/redis.swap
# 交换出来的value保存的文件路径/tmp/redis.swap
vm-max-memory 1000000
# redis使用的最大内存上限,超过上限后redis开始交换value到磁盘文件中。
vm-page-size 32
# 每个页面的大小32个字节
vm-pages 134217728
# 最多使用在文件中使用多少页面,交换文件的大小=vm-page-size * vm-pages
vm-max-threads 4
# 用于执行value对象换入换出的工作线程数量。0表示不使用工作线程
really-use-vm yes
# 增加此项才能真正的使用虚拟内存
11.高级话题
数据库选择:databases 16,默认0号数据库,select 数据库号(key独立);
数据库清楚:flushdb清空DB;flushall清除所在数据库和其它数据库中的数据;
键的操作:keys *;keys ?;keys XXX*;del key;
缓存操作:expire key Time;ttl key;
队列实现:BRPOP阻塞直到超时;brpop queue 0(表示不超时);brpop queue1…queueN;
12.Sort实现
返回或保存给定列表,集合,有序集合key中经过排序的元素;
排序默认以数字作为对象,值被解释为双精度浮点数,然后进行比较;
sort key:返回键值从小到大排序的结果;
sort key desc:返回键值从大到小排序的结果;
使用alpha修饰符对字符串进行排序:sort ListName alpha;
使用limit修饰符限制返回结果:sort age limit offset count
offset:指定要跳过的元素数量,即起始位置;0表示没有元素被跳过;
count:指定跳过offset个指定的元素之后,要返回多少个对象;
使用外部key进行排序:sort ListName by KeyName;
通过get选项可以根据排序的结果来取出相应的键值:sort ListName get KeyName;
获取多个外部键:sort ListName get # get K1 get K2;用#获取被排序键的值;
获取外部键但不进行排序:
通过将一个不存在的键作为参数传给by选项,可以让sort跳过排序操作,直接返回结果;
sort ListName by not-exists-key;
sort ListName by not-exists-key get # get K1 get K2(类似MySql的join);
将哈希表作为get或by的参数:sort ListName by hash键->hash域 get hash键->hash域;
保存排序结果:sort numbers store sorted-numbers;

评论列表( 0 )

你可以在登录后,发表评论

搜索帮助