Redis 基本类型介绍与基础操作指令

来源:互联网 发布:surge for mac 配置 编辑:程序博客网 时间:2024/04/30 08:39

这篇文章中的所有内容都是我看《Redis入门指南》中自己摘抄的笔记以及自己的理解,也是第一次接触 redis,所以很有可能下面给出的介绍不专业或者是错误的,还是自己亲手实践一下最安心。

首先先介绍以下 redis 可以存储哪些类型的数据,并且这些类型的数据的适用场景,以个人博客为例。

第一种类型--字符型

这个没什么好介绍的,只不过说一点我的个人发现,在 redis 中默认的存储方式就是字符,例如往其中添加一条数据 set key_name 1,之后使用类型判断命令 type key_name,结果就是显示 string 类型的,而且在其中存入字符类型时是不需要加双引号或者单引号的。 

字符基础操作命令:

清除全部数据flusahall 设置键值set key value同时设置多个值mset key1 value1 key2 value2 key3 value3得到键值get key同时得到多个值mget key1 key2 key3得到 value 的类型type key位操作,offset 就是位偏移量,以ASCII码为准setbit key offset valuegetbit key offsetbitcount key start endbitop operation destkey key1 [key2] (operation:or and xor not,destkey 最后的结果,key1 和 key2 参与计算的值)判断一个键值是否存在exists key删除键值del key筛选键值keys patternpattern:?匹配任意一个字符*匹配任意数量字符[]  匹配在 [] 中的任意一个字符\转义数字类型:当设置的 value 为整数时,增加1,不代表这个 value 的 type 是 int 类型,只是存储的内容是整数incr key类似于 incr,但是可以设置增加数量--incrementincrby key increment同样可以减少 value 的值decr keydecrby key decrement上面都是整数,下面介绍别的数据类型incrbyfloat key increment修改 value的值,在尾部添加数据,将原数据与 value 连接在一起append key value获取字符串类型的 value 的长度strlen key


第二种类型--散列类型

这个根据我个人理解有点像 json,但是不如 json 灵活,因为他不能嵌套,如一个散列类型里面不能嵌套其他类型,除了字符类型。想下面这张图一样的话比较好理解了。

相比较于 key value 的字符串类型,散列类型可以存储更过数据(这里的更多不是指物理实际上的,而是形式更加丰富),而且最重要的是可以就散列中的某个 field 进行筛选,虽然也是遍历全部 key,但是可以选择遍历 key 中的一部分,举个实际例子,一个博客系统,想设计一个根据文章名字进行筛选的系统,那么可以将文章拆分成以下形式:

这样下次遍历的时候只要遍历 key 下的 title,而不需要考虑很大篇幅的文章主体--text,有专门的指令,能根据 field 查找其中的内容。

散列类型基础操作指令:

(H hash)设置值hset key field valuehmset key field1 value1 field2 value2 field3 value3当字段不存在时产生该字段,存在则不执行hsetnx key field value (hsetnx== hash set not exists)读取值hget key fieldhmget key field1 field2 field3hgetall key (得到该 key 下的全部值,包括字段与值)判断该字段是否存在hexists key field删除字段hdel key field1 field2如果 value 为整数的话hincrby key field increment 得到该 key 下全部 fieldhkeys key得到该 key 下全部 valueshvals key获得该 key 下 fields 的数量hlen key


第三种类型--列表类型:

结构上就是《数据结构》中的双链表,在表的头和尾能进行进出操作,而且还有一些别的参数来记录一些信息,这样在读取一些需要遍历整张表才能得出的数据可以很快得到,例如整张表的长度。但是这不是列表类型的亮点,他的亮点是对读写一定数量的接近两端的数据特别快,举个例子,博客上每篇文章都有一个专门的 id 变量,存储在上面的散列类型中,但是如果我现在想知道最新更新的100篇文章,这个时候就有问题了,解决思路应该是:id 肯定是自增的,所以先要读出最大的 id,这篇文章一定是最新更新的,但是接下来的99篇文章呢?散列类型没有像关系型数据库类型的 order 关键字,这个时候你只能将你现有的 id -1,验证这篇文章是否存在,因为很有可能这个 id-1 的文章已经被删除了,甚至接下来的 id-2,id-3 等,都要执行一次判断该 id 下这篇文章是否存在,这样无疑会有很多多余的操作。这个时候就是列表类型彰显优势的时候了,你可以直接从左和右读取任意数量的数据,假设我是这样设计数据存储的,文章统一从列表左边存入数据库的,那么意味着左边的第一个元素永远是最新的数据,最右边的是已经成为历史的数据,有专门的命令可以完成这样的操作,所以列表类型一般是用来存储对时效性要求比较高的数据,如新闻的头条。同时列表类型也存在缺点,那就是根据索引查询数据会很慢,比如我想查看热度排行榜第68的文章,这个时候的列表类型反应也是慢的,而且越接近列表中间段的数据,操作起来越耗时。

列表类型基础命令:

(L list)从左边加入数据,删除数据lpush key valuelpop key从右边进行同样的操作 (r remove)rpush key valuerpop key获取列表中长度 (有一个专门的内置变量来存储这个值,不是靠调用的时候遍历列表来得到这个值的)llen key获取列表片段lrange key start stop (当 start,stop 为正数时表示从左边开始计算,为负数时表示从右边开始计数)删除列表中指定的值 (lrem list remove)lrem key count value 当 count >0 表示从列表左侧开始删除最多 count 个值为 value 的元素当 count <0 表示从列表右侧开始当 count =0 表示全部删除值为 value 的元素设置索引 (索引跟上面一样,正数表示从左边开始计算,负数表示从右边开始计算,结合数组理解吧)lset key index value获取索引下的 valuelindex key index只保留列表指定片段,注意是只保留 start end 之间,其余删除,不要弄反了 (跟上面一样的正负号意义)ltrim key start end想列表中插入元素linsert key before|after pivot value (pivot 支点,也就是列表中的一个值,在这里象征着支点)将一个元素从一个列表移动到另一个列表rpoplpush source destination (rpop from source lpush destination)


第四种类型--集合类型

高一数学课上学的集合的概念:无序的,不重复的元素的集合。跟这里的集合的概念很接近,他一般用来存储博客文章的标签,就像在CDSN写完文章后每次都会让你选择文章的类别,而且这个类别是无法重复的,比如你设置一个新类别,电脑需要提示你该标签已存在,如果不设置集合的话,我们就需要以这个标签为关键字查询数据库,根据处理结果判断这个标签是否存在,这样的耗时比直接采用集合类型是慢的,更何况还有集合的差集,交集,并集操作了,这些在关系型数据库中需要复杂的sql语句才能实现的功能,在 redis 中都封装好了。

集合类型基本操作:

(s set 集合的意思)增加,删除集合sadd key member1 member2 member3 srem key member1 member2 member3获取集合内部全部元素smembers key判断该元素是否在集合中sismember key member集合运算计算多个集合的差集sdiff key1 key2 key3 (注意差集的含义)计算多个集合的交集sinter key1 key2 key3并集sunion key1 key2 key3获取集合中的元素scard key完成上面的集合运算后存储结果sdiffstore destination key1 key2 key3sinterstore destination key1 key2 key3sunionstore destination key1 key2 key3随机获得集合中的元素srandmember key [count] (当 count 为正时表示获取集合中不重复的 count 个元素,为负时表示获取 count 个可以重复的元素)随机删除掉集合中的一个元素spop key


第五种类型--有序集合类型:

前面讲过的集合类型是无序的,但是有时我们需要对这些无序元素进行一个排列时,就要为这些无序元素添加一个变量,score了,可以理解为权重,基本上是 int 的类型,因为有些 score 需要进行一些计算,至于什么时候用到这些 score,就是看个人习惯了,例如我们在 CDSN 上发表博客的时候,总有一些标签的文章经常被用到,那么意味着用户在点击选择标签的时候希望这些标签能在前面被选择,而那些不常用的标签就排列在后面。当然这只是举个例子。

有序集合基本操作命令:

增加元素zadd key score1 member1 score2 member2 score3 member3 (score 可以设置成 +inf 和 -inf)获得元素的 score 属性zscore key member获得 索引 在一定范围内的 member 的值zrange key start stop [withscores] (start,stop 的正负含义跟上面一样,在这里表示索引)zrevrange key start stop [withscores] (上面是从小到大,这个是从大到小排列)获取 score 在一定范围内的 member 的值zrangebyscore key min max [withscores] (这里的 min 和 max 表示 score)zrevrangebyscore key min max [withscore] (跟上面一样)增加某个 member 的 score zincrby key increment member获得集合中元素的个数zcard key获得指定 score 范围内的元素个数,注意是个数,不是真实的元素zcount key min max删除一个或多个元素zrem key member1 member2 member3按照索引删除范围内的元素zremrangebyrank key start stop删除 score 范围内的元素zremrangebyscore key min max获得元素的索引zrank key memberzrevrank key member (逆向索引)集合计算并且存储计算结果交集zinterstore destination key1 key2 key3 [weights weight] aggregate sum|min|maxweight  destination 中元素的个数sumkey1,key2,key3中 score 的和就是 destination 中的元素的 score 的值minmax     同理并集zunionstore destination key1 ke
到这里就把 redis 的基本五种数据类型介绍完了,书才看了第三章,接下来还有进阶篇,实践篇等等 难过程序猿就是一条不归路啊。





0 0
原创粉丝点击