Redis的使用

Redis命令
Redis命令十分丰富,包括的命令组有Cluster、Connection、Geo、Hashes、HyperLogLog、Keys、Lists、Pub/Sub、Scripting、Server、Sets、Sorted Sets、Strings、Transactions一共14个redis命令组两百多个redis命令。可到:http://redis.cn/commands.html进行查看。

管道(PIpelining)
Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。所以一次请求会遵循以下步骤:①客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。②服务端处理命令,并将结果返回给客户端。在一次批量写入操作中,这会是一笔不小的开销。

一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应。这样就可以将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。这就是管道(pipelining)。但是在使用管道发送命令时,服务器会被迫回复一个队列将会占用很多内存,所以在需要发送大量命令时最好按照合理数量分批次处理。

Pub/Sub发布订阅
发布者和订阅者它们互相不知道对方,它们只需要知道发布/订阅的频道。这种发布者和订阅者的解耦合可以带来更大的扩展性和动态的网络拓扑。在这里插入图片描述在这里插入图片描述
Redis 的Pub/Sub实现支持模式匹配。客户端可以订阅全风格的模式以便接收所有来自能匹配到给定模式的频道的消息。
例如: PSUBSCRIBE news.* Redis 的Pub/Sub实现支持模式匹配。客户端可以订阅全风格的模式以便接收所有来自能匹配到给定模式的频道的消息。
客户端可能多次接收一个消息,如果它订阅的多个模式匹配了同一个发布的消息或者它订阅的模式和频道同时匹配到一个消息。
例如: SUBSCRIBE foo | PSUBSCRIBE f*

内存优化
小的聚合类型数据的特殊编码处理:Redis2.2版本及以后,存储集合数据的时候会采用内存压缩技术,以使用更少的内存存储更多的数据。如Hashes,Lists,Sets和Sorted Sets,当这些集合中的所有数都小于一个给定的元素,并且集合中元素数量小于某个值时,存储的数据会被以一种非常节省内存的方式进行编码,使用这种编码理论上至少会节省10倍以上内存(平均节省5倍以上内存)。并且这种编码技术对用户和redis api透明。因为使用这种编码是用CPU换内存,所以我们提供了更改阈值的方法,如下图只需在redis.conf里面进行修改即可。如果某个值超过了配置文件中设置的最大值,redis将自动把集合转换为正常的散列表。更改完配置后,最好做一下基准测试。在这里插入图片描述
使用32位的redis:使用32位的redis,对于每一个key,将使用更少的内存,因为32位程序,指针占用的字节数更少。但是32的redis整个实例使用的内存将被限制在4G以下。使用make 32bit命令编译生成32位的redis。RDB和AOF文件是不区分32位和64位的(包括字节顺序),所以你可以使用64位的reidis恢复32位的RDB备份文件,相反亦然。
尽可能使用散列表(hashes):小散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面。详细说明:http://redis.cn/topics/memory-optimization.html

过期(EXPIRE)
设置key的过期(老化)时间,超过时间后,将会自动删除该key。超时后只有做对key值进行改变的操作才会使他清除(这二者有什么区别?)。比如对key执行DEL、SET、GETSET操作,以及INCR递增key值或者HSET改变hash的field所有这些操作都会触发删除动作。

使用PERSIST命令可以清除超时并使其成为一个永久key。如果key被RENAME命令修改,相关的超时时间会转移到新key上,例如执行RENAME Key_B Key_A命令,这时超时状态会被Key_B的有效期状态覆盖。
使用EXPIRE命令可以更新key的过期时间。
Redis如何淘汰过期的keys:
Redis keys过期有两种方式:被动和主动方式。当一些客户端尝试访问它时,key会被发现并主动的过期。
当然,这样是不够的,因为有些过期的keys,永远不会访问他们。但这些keys应该过期,所以定时随机测试设置keys的过期时间。所有这些过期的keys将会从密钥空间删除。具体就是Redis每秒10次做的事情:
①测试随机的20个keys进行相关过期检测。
②删除所有已经过期的keys。
③如果有多于25%的keys过期,重复步骤1。

Redis大量数据插入(mass insertion)
有些时候,Redis实例需要装载大量用户在短时间内产生的数据,数百万计的keys需要被快速创建(大量数据插入)。
使用Luke协议:正常模式下的Redis客户端在进行一个个插入时会浪费大量的时间在每一个命令的往返上。使用管道(pipelining)是一种办法,但是在大量插入数据的同时又需要执行其他新命令时,读取数据的同时还需要尽可能快地写入数据。并不是所有客户端都能以最大限度的提高吞吐量的高效的方式来分析与答复。
从Redis2.6开始redis-cli支持一种新的被称为pipe mode的新模式用于执行大量数据插入工作。

使用pipe mode模式的执行命令:cat data.txt | redis-cli --pipe 用一个命令集文件模拟大量数据插入:在这里插入图片描述

会产生类似如下的输出:在这里插入图片描述

Redis从文件中批量插入数据
在redis中,可以将要执行的一行行命令存储到文件中,然后只需用一行命令就可以执行文件中的所有命令。
①创建文件:首先创建一个txt文件,将要执行的指令都写进去。在这里插入图片描述

  ②转码:redis-cli中只支持dos格式的换行符\r\n,如果在Linux、Mac、Windosw下创建的文件要转码否则会执行失败。

转码命令,只需要在命令后加入要转码的文件就好(如果提示没有这个命令,就需要安装工具):
③执行导入:文件转码后,开始进行导入。cat读取文件内容,redis-cli发送文件到redis执行。如果要导入的文件和redis在同一服务器上,可以直接将本地文件中的指令导入redis执行。在这里插入图片描述
如果导入的指令较多,可以用上面学习到的–pipe参数来启动pipe协议,它可以减少返回结果的输出,还能更快执行指令。当要导入的数据在远程主机上时(端口也是自定义的)可以用如下方法:在这里插入图片描述
注意!!!:只能使用set k1 v1这类包含三个元素的指令完成批量导入,遇到四个元素的可能会发生错误。导入指令文件不要在一行结束留空格或者空行。
FAQ:
Redis与其他key-value存储的不同之处?

Redis是键值数据库中不同的演化路径,其中值可以包含更复杂的数据类型,并在这些数据类型上定义原子操作。
Redis数据类型与基本数据结构密切相关,并且无需额外的抽象层即可向程序员公开。
Redis是一个内存但持久的磁盘数据库,因此它代表了一种不同的折衷方案,其中通过不能大于内存的数据集的限制实现了非常高的写入和读取速度。
内存数据库的另一个优点是,与磁盘上的相同数据结构相比,复杂数据结构的内存表示更易于操作,因此Redis可以做很多事情,内部复杂性很小。
同时,两种磁盘存储格式(RDB和AOF)不需要适合随机访问,因此它们非常紧凑,并且始终以仅附加方式生成。
Redis的内存占用情况?
100万个键值对(键为0~999999值为字符串“hello world”)在32的Mac笔记本上占100MB,但如果把同样的数据放到一个key中只需要16MB,因为 键值的开销很大。在Memcached(分布式高速缓存系统)上执行结果差不多,但是redis开销更大一点点,因为redis还会记录类型信息引用计数等等。
64位系统比32位需要更多的内存开销,因为64位系统中指针需要占8个字节。
如果我的数据集需要使用非常大的内存,我不希望使用一致性哈希或其他方式将数据集分布在不同的节点,我还能采用Redis吗?
同时使用传统数据库(例如Mysql)和Redis,Redis中存放所有读写频繁的数据(状态信息、用户身份验证token等),用Redis List存放与时间顺 序有关的id列表、编码等等。然后用Mysql来存放更大的数据。创建一个自增长ID作为主键和一个较大的BLOB字段作为数据字段,访问MySQL的数据 只能通过主键(ID) 。执行查询操作时,通过Redis读取数据, 但是当有读取打数据时需要通过主键(ID)访问MySQL数据库。
Redis是单线程的,我怎么提高多核CPU的利用率?
一般内存和网络才会是Redis的瓶颈,使用Redis的管道在linux系统上运行可以达到500K的RPS(requests per second),他们几乎不需要使用什么CPU。如果要最大限度地使用CPU,可以在一个服务器部署多个Redis的实例并把它们当作不同的服务器来使用。
更多问题与答案参考:https://www.redis.com.cn/redis-interview-questions
http://redis.cn/topics/indexes.html
Redis相关文章:http://redis.cn/articles.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值