<p> 前面第一课,我们讲完了Redis的一个安装过程,本次课程我将带领同学们深入Redis的实战,即我们怎么去使用Redis。</p>
讯享网
首先,参考第一课,我们启动一个端口为6379的redis服务;接下来,我们可以使用redis-cli连接和操作Redis服务。redis-cli可以使用两种方式连接Redis服务器。
我们可以用redis-cli -h{ip} {host} -p{port} {command}就可以对redis做一次操作,该操作会直接给我们返回相关结果,如我在192.168.239.132服务器上用配置文件的方式开启了一个6379端口的redis服务,那么我就在192.168.239.130服务器上使用redis-cli -h 192.168.239.132 -p 6379 set jiangsong hello,如下图1.1-1 连接报错示意图所示,可以看到的是报错了,我连接不上192.168.239.132这台服务器上的redis,这也是常见错误。
图1.1-1 连接报错示意图
这个报错的原因也很简单,也是新手同学们最常碰见的一个问题,这是因为Redis的配置文件:redis.conf下存在一个bind 127.0.0.1 -::1的配置,如下图1.1-2 bind配置示意图,这个配置会限制只有本机才能连上这个redis服务,因此我们使用#将这行配置注释掉,然后再找到password配置 这个是连接redis服务的密码,此处""号可加可不加,最后将其保存,如下图1.1-3 密码配置示意图所示,然后指定该配置文件重新启动redis服务即可。

图1.1-2 bind配置示意图

图1.1-3 密码配置示意图所示
如果你的本机还存在一模一样的错误,那么就是服务器下存在有redis端口的防火墙,我们需要执行如下命令:sudo firewall-cmd --permanent --remove-port=6379/tcp去关闭它,再使用sudo firewall-cmd --reload命令重新加载防火墙配置即可,某些虚拟机环境可能不生效,可以直接service firewalld stop让防火墙关闭即可。
最终,成功在192.168.239.132服务器上运行单次操作:redis-cli -h 192.168.239.132 -p 6379 -a set jiangsong hello,注意-a后面跟的就是上一步在redis.conf下新增的密码,如下图1.1-3 执行单次操作示意图,有warning警告,是因为单次操作加上了密码明文,在redis认为是不安全的,但没关系,本次操作是OK的。我们可以看到,使用redis-cli -h 192.168.239.132 -p 6379 -a get jiangsong也是获得了值hello。

图1.1-3 执行单次操作示意图
通过redis-cli -h (host}-p {port}的方式连接到Redis服务,之后所有的操作都是通过控制台进行,如下图1.2-1 命令行操作示意图所示,那么接下来我们就可以基于命令行操作,愉快的对redis进行实践了。

图1.2-1 命令行操作示意图所示
Redis提供了一些数据结构供我们往Redis中存取数据,最常用的基本数据结构有5种,字符串(String)、哈希(Hash)、列表(list)、集合(set)、有序集合(ZSET)。此外,还用得比较多的高级数据数据结构有4种,分别是位图(bitmap),基数统计(HyperLogLog),地理位置索引(GEO),流数据结构(Stream),本文会先详细介绍五种基本数据结构的使用。
字符串类型是Redis最基本的数据结构,其它几种数据结构也都是在字符串类型基础上构建的,所以先学好字符串类型,可以为学习其它四种基础数据结构类型奠定好基础。此外,Redis的字符串类型不仅可以是字符串,还可以是数字,二进制(图片,音频,视频),但是值不能大于512M。现在,我们来用命令感受一下字符串类型的使用吧。
2.1.1 set和get
首先,我们还是以命令行操作,像第一节单次操作那里我们已经接触到了set和get的命令,这就是字符串类型数据,其中set命令的格式一般如下:
讯享网
get命令的格式很简单,就是get [key]即可。
2.1.2 setex和setnx
除了set之外,还有setex和setnx指令,setex和 setnx的作用和ex和nx选项是一样的。也就是,setex为键设置秒级过期时间,setnx设置时键必须不存在,才可以设置成功,命令格式如下:。
2.1.3 mset
我们前面讲到的set,setex,setnx等指令都是单个键值对设置的指令,假如我们需要批量设置多个的话,就会用到mset指令了,命令格式如下:
讯享网
2.1.4 incr,incyby,decr,decrby
incr命令用于对值做自增操作,返回结果分为三种情况:
1. 值不是整数,返回错误。
2. 值是整数,返回自增后的结果。
3. 键不存在,按照值为0自增,返回结果为1
除了incr命令,Redis提供了decr(自减)、 incrby(自增指定数字)、decrby(自减指定数字)、incrbyfloat(自增浮点数),具体效果请同学们自行尝试。
命令格式如下(decr和decrby是一样的):
2.1.5 append
append可以向字符串尾部追加值,如get jiangsong返回的是hello,使用append jiangsong jiangsong后,再get jiangsong返回的是hellojiangsong,命令格式如下
讯享网
2.1.6 strlen
返回字符串值的长度,命令格式:
2.1.7 getset
getset和set一样会设置值,但是不同的是,它同时会返回键原来的值,命令格式:
讯享网
2.1.8 setrange
设置指定位置的字符,命令格式如下:
2.1.9 getrange
获取指定范围的字符串,命令格式如下:
讯享网
2.1.10 命令的时间复杂度
字符串这些命令中,除了del 、mset、 mget支持多个键的批量操作,时间复杂度和键的个数相关,为O(n),getrange和字符串长度相关,也是O(n),其余的命令基本上都是O(1)的时间复杂度,在速度上是非常快的。
2.1.11 使用场景
使用场景
字符串类型的使用场景很广泛:
缓存功能
Redis 作为缓存层,MySQL作为存储层,绝大部分请求的数据都是从Redis中获取。由于Redis具有支撑高并发的特性,所以缓存通常能起到加速读写和降低后端压力的作用。
计数
使用Redis 作为计数的基础工具,它可以实现快速计数、查询缓存的功能,同时数据可以异步落地到其他数据源。
共享Session
一个分布式Web服务将用户的Session信息(例如用户登录信息)保存在各自服务器中,这样会造成一个问题,出于负载均衡的考虑,分布式服务会将用户的访问均衡到不同服务器上,用户刷新一次访问可能会发现需要重新登录,这个问题是用户无法容忍的。
为了解决这个问题,可以使用Redis将用户的Session进行集中管理,,在这种模式下只要保证Redis是高可用和扩展性的,每次用户更新或者查询登录信息都直接从Redis中集中获取。
限速
比如,很多应用出于安全的考虑,会在每次进行登录时,让用户输入手机验证码,从而确定是否是用户本人。但是为了短信接口不被频繁访问,会限制用户每分钟获取验证码的频率,例如一分钟不能超过5次。一些网站限制一个IP地址不能在一秒钟之内方问超过n次也可以采用类似的思路。
Java里提供了HashMap,Redis中也有类似的数据结构,就是哈希类型。但是要注意,哈希类型中的映射关系叫作field-value,注意这里的value是指field对应的值,不是键对应的值。基本上,哈希的操作命令和字符串的操作命令很类似,很多命令在字符串类型的命令前面加上了h字母,代表是操作哈希类型,同时还要指明要操作的field的值。
2.2.1 hset
hset依然也是设置键值对,但不同的是你可以理解为它的值是一个对象,比如hset user:1 id 1 name jiangsong age 18,咱们把这个看成我们设置了一个user:1的key,value是一个id为,name为jiangsong,age为18的对象。
2.2.2 hget,hmget
讯享网
2.2.3 hdel
删除一个或者多个field字段,命令格式:
2.2.4 hlen
hlen [key]:计算key的field个数。
2.2.5 hexists
hexists [key] [field]:判断field是否存在。
2.2.6 hkeys,hvals
hkeys [key]:返回所有的field字段名。
hvals [key]:返回所有field对应的value值。
2.2.7 hgetall
hgetall [key]:返回所有的field以及对应的value值。
2.2.8 hincyby
hincrby和 hincrbyfloat,就像incrby和incrbyfloat命令一样,但是它们的作用域是filed。
2.2.9 hstrlen
hstrlen [key] [field]:返回field对应的value的字符串长度。
2.2.10 使用场景
从前面的操作可以看出,String和Hash的操作非常类似,那为什么要弄一个hash出来存储。
哈希类型比较适宜存放对象类型的数据。
列表( list)类型是用来存储多个有序的字符串,a、b、c、c、b四个元素从左到右组成了一个有序的列表,列表中的每个字符串称为元素(element),一个列表最多可以存储(2^32-1)个元素()。

在Redis 中,可以对列表两端插入( push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等。列表是一种比较灵活的数据结构,它可以充当栈和队列的角色,在实际开发上有很多应用场景。
列表类型有两个特点:
第一、列表中的元素是有序的,这就意味着可以通过索引下标获取某个元素或者某个范围内的元素列表。
第二、列表中的元素可以是重复的。
2.3.1 lpush和rpush
lpush/rpush分别对应的是向左/向右插入列表元素,命令格式如下:
讯享网
2.3.2 lrange
获取指定范围内的元素列表(不会删除元素),命令格式:
2.3.3 linsert
在列表某个元素前后添加一个元素,命令格式如下:
讯享网
2.3.4 lpop和rpop
lpop/rpop分别是向左或者向右从列表弹出元素的命令,注意它们在弹出元素后都会将元素进行删除,命令格式如下:
2.3.5 blpop和brpop
blpop和brpop是lpop和rpop的阻塞版本,除此之外还支持多个列表类型,也支持设定阻塞时间,单位秒,如果阻塞时间为0,表示一直阻塞下去,命令格式如下:
讯享网
使用场景:
消息队列,Redis 的 lpush+brpop命令组合即可实现阻塞队列,生产者客户端使用lrpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性。
2.3.6 lrem
lrem命令会从列表中找到等于value的元素进行删除,根据count的不同分为三种情况:

count>0,从左到右,删除最多count个元素。
count<0,从右到左,删除最多count绝对值个元素。
count=0,删除所有。
命令格式如下:
2.3.7 ltrim
该命令可以按照索引范围修剪列表,命令格式如下:
讯享网
2.3.8 lset
修改指定索引下标的元素,命令格式如下:
2.3.9 lindex
获取列表指定位置的元素,命令格式如下:
讯享网
2.3.10 llen
llen [key]:获取列表长度,即元素的个数。
2.3.11 使用场景
列表类型可以用于比如:
消息队列,Redis 的 lpush+brpop命令组合即可实现阻塞队列,生产者客户端使用lrpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性。
文章列表
每个用户有属于自己的文章列表,现需要分页展示文章列表。此时可以考虑使用列表,因为列表不但是有序的,同时支持按照索引范围获取元素。
实现其他数据结构:
lpush+lpop =Stack(栈)
lpush +rpop =Queue(队列)
lpush+ ltrim =Capped Collection(有限集合)
lpush+brpop=Message Queue(消息队列)
集合( set)类型也是用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。
一个集合最多可以存储2的32次方-1个元素。Redis除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集,合理地使用好集合类型,能在实际开发中解决很多实际问题。
2.4.1 sadd
允许添加多个,返回结果为添加成功的元素个数,格式:
2.4.2 srem
删除元素,允许删除多个,返回结果为删除成功的元素个数,格式与sadd一致。
2.4.3 scard
计算元素个数,格式:scard [key]。
2.4.4 sismember
判断元素是否在集合中,格式:
讯享网
2.4.5 srandmember
随机从集合中返回1个或者多个元素,格式如下:
2.4.6 spop
与srandmember作用以及命令格式一致,唯一的区别是spop会将弹出的元素删除,而srandmember不会删除元素。
2.4.7 smembers
获取集合中的所有元素,但是返回的元素是无序的,命令格式:smembers [key]。
2.4.8 sinter
求多个集合的交集,格式:
讯享网
2.4.9 sunion
求多个集合的并集,格式与sinter一致。
2.4.10 sdiff
求多个集合的差集
2.4.11 将交集,并集和差集的结果保存
2.4.12 使用场景
集合类型比较典型的使用场景是标签(tag)。例如一个用户可能对娱乐、体育比较感兴趣,另一个用户可能对历史、新闻比较感兴趣,这些兴趣点就是标签。有了这些数据就可以得到喜欢同一个标签的人,以及用户的共同喜好的标签,这些数据对于用户体验以及增强用户黏度比较重要。
例如一个电子商务的网站会对不同标签的用户做不同类型的推荐,比如对数码产品比较感兴趣的人,在各个页面或者通过邮件的形式给他们推荐最新的数码产品,通常会为网站带来更多的利益。
除此之外,集合还可以通过生成随机数进行比如抽奖活动,以及社交图谱等等。
2.5 有序集合
有序集合相对于哈希、列表、集合来说会有一点点陌生,但既然叫有序集合,那么它和集合必然有着联系,它保留了集合不能有重复成员的特性,但不同的是,有序集合中的元素可以排序。它和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个分数( score)作为排序的依据。
有序集合中的元素不能重复,但是score可以重复,就和一个班里的同学学号不能重复,但是考试成绩可以相同。
有序集合提供了获取指定分数和元素范围查询、计算成员排名等功能,合理的利用有序集合,能帮助我们在实际开发中解决很多问题。
2.5.1 zadd
添加集合元素的操作,返回结果代表成功添加的个数,格式如下:
讯享网
2.5.2 zcard
获取成员个数,格式:zcard [key]。
2.5.3 zscore
获取某个成员的分数,格式:zscore [key] [member]
2.5.4 zrank
计算成员排名,格式与zscore一致。
2.5.5 zrem
删除一个或者多个元素,格式:
2.5.6 zincrby
增加某个成员的分数,返回结果是增加后的分数,格式:
讯享网
2.5.7 zrange和zrevrange
有序集合是按照分值排名的,zrange是从低到高返回,zrevrange反之。如果加上 withscores选项,同时会返回成员的分数,格式:
2.5.8 zrangebyscore
返回指定分数范围的成员,格式:
讯享网
2.5.9 zcount
返回指定分数范围成员个数,格式:zcount key min max。
2.5.10 zremrangebyrank
按升序删除指定排名内的元素,格式:zremrangebyrank key start end。
2.5.11 zremrangebyscore
删除指定分数范围的成员,格式:zremrangebyscore key min max
2.5.12 zinterstore
求多个有序集合的交集,格式:
2.5.13 zunionstore
求多个有序集合的并集,命令格式与zinterstore完全一致,不赘述。
2.5.14 使用场景
有序集合比较典型的使用场景就是排行榜系统。例如视频网站需要对用户上传的视频做排行榜,榜单的维度可能是多个方面的:按照时间、按照播放数量、按照获得的赞数。
对于键值数据库而言,基本的数据模型是 key-value 模型,Redis 支持的 value 类型包括了 String、哈希表、列表、集合等,而Memcached支持的 value 类型仅为 String 类型,所以Redis 能够在实际业务场景中得到广泛的应用,就是得益于支持多样化类型的 value。
Redis里面有16个库,但是Redis的分库功能没啥意义(默认就是0号库,尤其是集群操作的时候),我们一般都是默认使用0号库进行操作。
在了解Rediskey-value 模型之前,Redis的有一些全局命令,需要我们提前了解。
keys *是获取redis所有键的命令,另外它还支持模糊匹配,如keys L*就是取L开头的所有键。但是生产环境请不要使用keys *命令,因为keys命令要把所有的key-value对全部拉出去,如果生产环境的键值对特别多的话,会对Redis的性能有很大的影响,推荐使用dbsize。keys命令会遍历所有键,所以它的时间复杂度是o(n),当Redis保存了大量键时线上环境禁止使用keys命令。
讯享网
dbsize命令会返回当前数据库中键的总数,该命令在计算键总数时不会遍历所有键,而是直接获取 Redis内置的键总数变量,所以dbsize命令的时间复杂度是O(1)。
检查key是否在redis中存在的命令,不存在返回0,格式:exists [keys....],格式为复数形式,说明它可以检查一个或者多个key,返回几就说明有几个key是存在的。
顾名思义,它是删除一个或者多个键的命令,格式:del [keys...],返回删除键个数,删除不存在键返回0。同时del命令可以支持删除多个键。
这两个命令都是给某一个Key设置过期时间的,不同的是expire设置的时间单位秒,expireat设置的是秒级时间截timestamp后过期,此外,还有pexpire和pexpireat,与前者不同的是,它们的单位是到毫秒级。格式:
返回键的数据结构类型,例如键lijin是字符串类型,返回结果为string。键mylist是列表类型,返回结果为list,键不存在返回none。命令格式非常简单:type 【key】;
随机返回一个Key。
键重命名,但是要注意,如果在rename之前,新键已经存在,那么它的值也将被覆盖。如下图3.8-1 rename使用示例图所示:
图3.8-1 rename使用示例图
ttl命令会返回键的剩余过期时间,它有3种返回值:
大于等于0的整数:键剩余的过期时间。
-1:键没设置过期时间。
-2:键不存在
格式:ttl [key];
本章详细讲述了redis客户端怎么连接,具体包括单次操作以及redis客户端常见的使用错误,后面又讲述了基于命令行模式下,五大基本数据结构的API使用以及其使用的场景,最后又讲述了Redis常用的全局命令。但是请记得自己一定要多去操作,去试,尤其是五大数据结构的常用API,只有自己去操作了,才会深入的理解它的使用场景。下一章,我们将会开始使用JAVA代码来进行Redis操作的实战啦!但是实战的基础还是在于熟悉咱们这节课学到的Redis命令。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/200668.html