首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Redis从入门到精通:中级篇

本文目录

上一篇文章以认识Redis为主,写了Redis系列的第一篇,现在开启第二部分的学习,在本文中,我们将看到以下内容:

Redis数据结构String、Hash、List、Set、SortedSet及相关操作,提一下Redis在3.2.0之后新增了一种GEO的数据类型表示地理位置,不过本文这种数据结构略过

Redis其他一些常用命令,分为Key操作与服务器操作

Redis事务机制

主要以实战为主,希望通过本文可以让大家掌握Redis的基本使用。

本来这篇文章还准备加上Redis线程模型分析的,但是写完发现篇幅实在太长,就把Redis线程模型放到最后一篇中了,也挺好的,本文专注于对Redis命令的讲解。

另外说一下,本文讲Redis中的数据结构,但是数据结构本身不在本文的讲解范围内,如果想知道Hash、List、Set等数据结构特点及使用场景,可以自己查阅数据结构相关资料。

String数据结构的基本操作

首先说一下数据结构String,这是Redis中最简单的一种数据结构,和MemCache数据结构是一样的,即Key-Value型的数据,根据Redis官方文档,Value最大值为512M

下面用表格来看一下String操作的相关命令:

首先,演示一下SET、GET、SETEX的效果:

图中我们应该能看到SET、GET、SETNX几个命令的效果了,在这之外,专门提两点:

Redis的命令不区分大小写

Redis的Key区分大小写

接着我们演示一下SETEX命令的效果:

这里顺带介绍了TIME命令,它返回的是当前服务器Unix时间戳,但单位为秒(通常Unix时间戳取的时间为毫秒)。看到设置Redis-Expire这个Key,马上获取不失效,第26秒获取的时候失效,关于失效,Redis的策略是这样的:

被动触发,即GET的时候检查一下Key是否失效

主动触发,后台每1秒跑10次定时任务(通过redis.conf的hz参数配置,默认为10,这个上文没有写),随机选择100个设置了过期时间的Key,对过期的Key进行失效

最后看一下MGET和MSET命令:

看到可以同时设置多个Key-Value,也可以同时获取多个Key对应的Value,再次注意,Redis的Key是严格区分大小写的。

特殊的String操作:INCR/DECR

前面介绍的是基本的Key-Value操作,下面介绍一种特殊的Key-Value操作即INCR/DECR,可以利用Redis自动帮助我们对一个Key对应的Value进行加减,用表格看一下相关命令:

下面实际看一下四个命令相关使用:

INCR/DECR在实际工作中还是非常管用的,举两个例子:

原先单机环境中统计在线人数,变成分布式部署之后可以使用INCR/DECR

由于Redis本身极高的读写性能,一些秒杀的场景库存增减可以基于Redis来做而不是直接操作DB

Hash数据结构相关操作

接着讲一下Hash,Hash本质上和String是一样的,无非String是纯粹的Key-Value,Hash是外面套了一层东西,里面还是Key-Value,接着我们用表格看一下Hash数据结构的相关命令:

同样的,实际看一下这些命令的相关使用:

稍乱,但是除了HMSET、HMGET以外把所有命令都演示到了。

List数据结构相关操作

接着我们看一下Redis中的List,相关命令有:

接着看一下这些命令的实际使用效果:

工具所限,LSET、LINSERT、RPOPLPUSH几个命令没法演示,上面演示了其他的基本命令,应该足以理解Redis的List了,操作List千万注意区分LPUSH、RPUSH两个命令,把数据添加到表头和把数据添加到表尾是完全不一样的两种结果

另外List还有BLPOP、BRPOP、BRPOPLPUSH三个命令没有说,它们是几个POP的阻塞版本,即没有数据可以弹出的时候将阻塞客户端直到超时或者发现有可以弹出的元素为止

SET数据结构相关操作

接着我们看一下SET数据结构的相关操作:

同样,实际测试一下Set:

除了SINTER没有用到,其他应该比较全面地展示了Set的相关使用。

SortedSet数据结构相关操作

数据结构最后说一下SortedSet相关操作,最近有一个场景需要实现Redis分页+高效移除数据,一下子没找到好的数据结构,后来想起了SortedSet才解决了问题,看来积累与储备还是非常有用的,

SortedSet顾名思义,即有序的Set,看下相关命令:

还有若干不是很常用的命令没有写,就略过了,有兴趣的可以自己看一下,接着看一下SortedSet实际使用:

这个地方排名的时候稍微注意下,和我们认为的排名有些微区别,比如1 1 2 3,由于有两个1,因此3正序的Rank应当为2(以0为下标),但实际上会是3,所以Rank应当理解为元素在集合中的下标位置更加准确

Redis的Key相关操作

写完了Redis的数据结构,接着我们看下Redis的Key相关操作:

简单看一下实际使用:

这里特别注意KEYS命令,虽然KEYS命令速度非常快,但是当Redis中百万、千万甚至过亿数据的时候,扫描所有Redis的Key,速度仍然会下降,由于Redis是单线程模型,这将导致后面的命令阻塞直到KEYS命令执行完。

因此当Redis中存储的数据达到了一定量级(经验值从10W开始就值得注意了)的时候,必须警惕KEYS造成Redis整体性能下降

系统相关命令

接着介绍一下部分系统相关命令:

看下命令的使用演示:

SELECT命令忘了,想起来的时候数据库已经清空了就算了,使用SELECT后控制台会变成"127.0.0.1:6379[3]>",即带上数据库的index。

Redis的事务

最后,本文简单说一下Redis的事务机制,首先Redis的事务是由DISCARD、EXEC、MULTI、UNWATCH、WATCH五个命令来保证的:

首先我们看一下事务没有被打断的情况:

看到开启事务之后,所有的命令返回的都是QUEUED,即放入队列,而不是直接执行。

接着模拟一下事务被打断的情况,WATCH一下Number这个Key,我另外起了一个Redis客户端INCR了一下Number,结果为:

看到,并没有命令被执行,返回nil即事务被打断。

接着简单说一下事务,和数据库类似的,事务保证的是两点:

隔离,所有命令序列化、按顺序执行,事务执行过程中不会被其他客户端发来的命令打断

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

另外,Redis的事务并不支持回滚,这个其实网上已经说法挺多了,大致上是两个原因:

Redis命令只会因为语法而失败(且这些问题不能再入队时被发现),或是命令用在了错误类型的键上面,也就是说,从实用性角度来说,失败的命令是由于编程错误造成的,而这些错误应该在开发的过程中被发现而不应该出现在生产环境中

Redis内部可以保持简单且快速,因为不需要对回滚进行支持

总而言之,对Redis来说,回滚无法解决编程错误带来的问题,因此还不如更简单、更快速地无回滚处理事务。

下期预告

最后预告一下最后一篇文章会写的内容,四部分:

Redis线程模型

Redis的RDB

Redis的AOF

Redis的集群方式

喜欢的朋友可以关注一下最后一篇文章。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180501G1BAUN00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券