自学内容网 自学内容网

Redis实战-初识Redis

如有侵权,请联系~
如有错误,也欢迎批评指正~
本篇文章大部分是来自学习《Redis实战》的笔记

1、Redis简介

Redis 是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生 的 独 一无 二的 数 据 模 型 。 Redis 提供了5种不同类型的数据结构,各式各样的问题都可以很自然地映射到这些数据结构上:Redis 的数据结构致力于帮助用户解决问题,而不会像其他数据库那 样,要求用户扭曲问题来适应数据库。除此之外,通过复制、持久化(persistence )和客户端分 片(client -side sharding )等特性,用户可以很方便地将Redis 扩展成一个能够包含数百GB 数据、 每秒处理上百万次请求的系统。

需求是否使用redis或者是redis作为主存储还是二级存储取决于程序对性能的要求以及成本问题。

存储类型描述
Redis内存存储的非关系型数据库支持五种数据结构:字符串、列表、集合、散列、有序集合; 支持持久化;可以不必像MySQL随机读写、写入临时表,不需要查询分析器、优化器进行处理
memcached内存存储的键值缓存只支持字符串;不支持持久化;用户只能用APPEND命令将数据添加到已有字符串的末尾,采用的办法是通过黑名单(blacklist)来隐藏列表里面的元素,从而避免对元素执行读取、更新、写入
MySQL关系型数据库支持ACID事务;存在查询分析器、查询优化器;

2、 Redis数据结构简介

Redis客户端与服务端交互图【以java为例子】:
在这里插入图片描述
这里只是简单的介绍一下数据结构,以及部分命令:

Redis数据结构
数据结构命令行为描述示例
字符串GET获取存储在给定键中的值get key
SET设置存储在给定键中的值set key value
DEL删除存储在给定键中的值del key
列表LPUSH将给定的值推入列表的左端lpush key value
RPUSH将给定的值推入列表的右端rpush key value
LPOP从列表的左端弹出一个值,并返回被弹出的值lpop key
RPOP从列表的右端弹出一个值,并返回被弹出的值rpop key
LINDEX获取列表上给定位置的单个元素lindex key 1
LRANGE获取列表上在给定范围上的所有值lrange key 0 3
集合SADD将给定的元素添加到集合sadd key value
SMEMBERS返回集合中所有的元素smembers key
SISMEMBER检查给定元素是否存在于集合sismember key value
SREM如果集合中存在该元素,则移除该元素srem key value
散列HSET在散列里面关联给定的键值对hset key key1 value1
HGET获取指定的散列的值hget key key1
HGETALL获取散列中包含的所有键值对hgetall key
HDEL如果给定键存在于散列中,那么移除这个键hdel key key1
有序集合ZADD将一个带有给定分值的成员添加到有序集合中zadd key 123 value
ZRANGE从有序集合中获取指定位置范围的数据zrange key 1 3
ZRANGEBYSCORE获取有序集合在给定分值范围内的所有元素zrangebyscore key 0 800
ZREM如果给定成员存在于有序集合,那么移除这个成员zrem key value

3、 Redis命令

这里的命令不再包含上述简单的命令。

3.1 字符串

Redis的字符串是一个由字节组成的序列,字符串可以存储三种类型的值:字节串、整数【在64位系统上就是64位有符号整数,32位系统就是32位有符号整数】、浮点数【取值范围和double相同】。

字符串
命令行为描述示例注释
INCR将给定键中的值加1incr key1.当用户将一个值存储到Redis的时候,如果这个值可以被解释为整数或者浮点数,那么Redis允许用户对这个字符串执行各种incr*和decr*操作;
2.如果这个值不可以被解释为整数或者浮点数,执行自增或者自减操作,Redis会返回一个错误;
3.如果执行自增或者自减操作的时候,键值对不存在或者是值为空串,Redis会当做值为0进行处理
DECR将给定键中的值减1decr key
INCRBY将给定键中的值加上整数incrby key amount
DECRBY将给定键中的值减去整数decrby key amount
INCRBYFLOAT将给定键中的值加上浮点数incrbyfloat key amount
APPEND将值value追加到给定键对应的值的末尾append key value 1、在执行setrange或者setbit命令对字符串进行写入的时候,如果字符串长度不够,那么Redis会自动使用空字节(null)将字符串扩展至所需的长度,然后再执行写入或者更新操作;
2、在使用getrange读取字符串的时候,超过字符串的长度那部分视为空串;
3、在使用getbit读取二进制串的时候,超过字符串长度为0
GETRANGE获取给定键值从偏移量start到end的字串,包括start和end在内getrange key start end
SETRANGE给定键值从偏移量offset开始的位置到offset+len(value)的位置被指定的字符串覆盖setrange key offset value
GETBIT返回二进制串指定位置的二进制值getbit key offset 这其实就是位图bitmap。位图是基于字符串类型的一种特殊应用,将一个字符串视为一系列的二进制位。
SETBIT设置二进制串指定位置的二进制值为value(0或者1)setbit key offset value
BITCOUNT统计二进制串中二进制值为1的数量,如果给定了start和end偏移量,那么只统计偏移量范围内的二进制位bitcount key [start end]
BITTOP对一个或者多个二进制串执行包括并(AND)、或(OR)、异或(XOR)、非(NOT)按位运算操作,结果存储到dest-key键中bittop operation dest-key key1 [key2]

3.2 列表

列表
命令行为描述示例注释
LTRIM对列表进行裁剪,只保留[start, end]范围内的元素ltrim key start end
BLPOP从第一个非空列表中弹出位于最左端的元素或者阻塞timeout秒并等待可弹出的元素blpop key1 [key2 ...] timeout阻塞弹出和弹出并推入命令最常见的用例就是消息传递和任务队列
BRPOP从第一个非空列表中弹出位于最右端的元素或者阻塞timeout秒并等待可弹出的元素brpop key1 [key2 ...] timeout
RPOPLPUSH从source-key列表中弹出位于最右端的元素,然后将这个元素推入到dest-key列表的最左端,并给用户返回这个元素rpoplpush source-key dest-key
BRPOPLPUSH从source-key列表中弹出位于最右端的元素,然后将这个元素推入到dest-key列表的最左端,并给用户返回这个元素;如果source-key中没有元素,那么会阻塞timeout秒等待可弹出元素的出现brpoplpush source-key dest-key
列表的优点:可以包含多个字符串值。

3.3 集合

集合
命令行为描述示例
SCARD返回集合中元素个数scard key
SRANDMEMBER从集合中随机的返回一个或者多个元素。当count为正数的时候,命令返回的随机元素不会重复;为负数的时候,返回的随机元素可能重复srandmember key [count]
SPOP从集合中随机的移除一个元素,并返回被移除的元素spop key
SMOVE如果source-key集合中包含item元素,那么从source-key中移除该元素,并将该元素添加到集合dest-key集合中smove source-key dest-key item
接下来的命令用于处理和组合多个集合
SDIFF返回存在于第一个集合但不存在于其他集合中的元素【差集】sdiff key1 [key2 ...]
SDIFFSTORE将存在于第一个集合但不存在于其他集合中的元素【差集】存储到dest-key键里面sdiffstore dest-key key1 [key2 ...]
SINTER返回同时存在于所有集合的元素【交集】sinter key1 [key2 ...]
SINTERSTORE将同时存在于所有集合的元素【交集】存储到dest-key键里面sinterstore dest-key key1 [key2 ...]
SUNION返回所有集合的元素【并集】sunion key1 [key2 ...]
SUNIONSTORE将同时存在于所有集合的元素【交集】存储到dest-key键里面sunionstore dest-key key1 [key2 ...]

3.4 散列

散列
命令行为描述示例注释
HMGET返回散列中一个或者多个键的值hmget key hashkey1 [hashkey2 ..]
HMSET为散列设置一个或者多个键值对hmset key hashkey1 value1 [hashkey2 value2 ..]
HDEL删除散列中一个或者多个键值对,返回成功删除键值对的个数hdel key hashkey1 [hashkey2 ...]
HLEN返回散列中包含的键值对个数hlen key
HEXISTS返回给定的键是否存在于散列中hexists key hashkey
HKEYS获取散列中包含的所有键hkeys key尽管有hgetall了,但是hkeys和hvals仍然存在的必要。如果散列包含的值很大,那么用户可以先使用hkeys获取散列包含的所有键,然后分多次获取hget/hmget一个或者多个键值对,避免因为一次获取多个大体积的导致服务端阻塞
HVALS获取散列中包含的所有值hvals key
HGETALL获取散列中包含的所有键值对hgetall key
HINCRBY将键hashkey存储的值增加整数incrementhincrby key hashkey increment
HINCRBYFLOAT将键hashkey存储的值增加浮点数incrementhincrbyfloat key hashkey increment

3.5 有序集合

有序集合
命令行为描述示例注释
ZADD将带有分值的成员添加到有序集合里面zadd key score member [score member ..]
ZREM从有序集合中删除给定的成员,返回被删除的成员数量zrem key member [member ..]
ZCARD返回有序集合中成员数量zcard key
ZINCRBY给member成员的分值上加上incrementzincrby key increment member
ZCOUNT返回分值介于[min, max]之间的成员数量zcount key min max
ZRANK返回成员member在有序集合中的排名zrank key member
ZSCORE返回成员member的分值zscore key member
ZRANGE返回有序集合中排名介于[start, stop] 之间的成员,如果带有withscores参数,那么命令会将成员的分值一并返回zrange key start stop [withscores]
ZREVRANK返回成员member在有序集合中的【逆序,分值按照从大到小排序】排名zrevrank key member
ZREVRANGE按照逆序【分值按照从大到小排序】返回有序集合中排名介于[start, stop] 之间的成员,如果带有withscores参数,那么命令会将成员的分值一并返回zrevrange key start stop [withscores]
ZRANGEBYSCORE返回有序集合中分值介于[min,max]之间的成员zrangebyscore key min max [withscores]
ZREVRANGEBYSCORE按照分数值从大到小的顺序返回有序集合中分值介于[min,max]之间的成员zrevrangebyscore key min max [withscores]
ZREMRANGEBYRANK删除有序集合中排名介于[min,max]之间的成员zremrangebyrank key min max
ZREMRANGEBYSCORE删除有序集合中分值介于[min,max]之间的成员zremrangebyscore key min max
ZINTERSTORE用于计算多个有序集合的交集,并将结果存储在新的有序集合中zinterstore dest-key numsourcekeys source-key1 source-key2 [WEIGHTS weight [weight ...]] [AGGREGATE sum|min|max]对集合求并集或者交集,不只是有序集合,对集合也可以。甚至有序集合和集合一起也可。这里的source-key可以是集合,如果是集合的话,集合中的元素分值默认为1
ZUNIONSTORE计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destinationzunionstore dest-key numsourcekeys source-key1 source-key2 [WEIGHTS weight [weight ...]] [AGGREGATE sum|min|max]

3.6 发布与订阅

发布与订阅
命令行为描述示例注释
SUBSCRIBE订阅一或多个频道subscribe channel [channel]发送者往频道发送二进制消息,每当消息发送到频道时,订阅者都会收到消息
UNSUBSCRIBE退订一或多个频道,如果没有给定频道那么退订所有频道unsubscribe [channel [channel]]
PUBLISH给指定频道发消息publish channel message
PSUBSCRIBE订阅与给定模式相匹配的所有频道psubscribe pattern [pattern]
PUNSUBSCRIBE退订给定模式的频道,如果没有给定模式那么退订所有频道punsubscribe [pattern [pattern]]

虽然redis提供了发布和订阅功能,但是一般不建议使用,原因:

  • redis的稳定性问题。如果订阅者读取消息的速度不够快的话,消息的不断积压会导致输出缓冲区越来越大,这可能会导致Redis 的速度变慢,甚至直接崩溃。也可能会导致Redis 被操作系统强制杀死,甚至导致操作系统本身不可用。新版的Redis 不会出现这种问题,因为它会自动断开不符合 client-output-buffer-limitpubsub配置选项要求的订阅客户端。
  • 和数据传输的可靠性有关。任何网络系统在执行操作时都可能会遇上断线情况, 而断线产生的连接错误通常会使得网络连接两端中的其中一端进行重新连接。 如果客户端在执行订阅操作的过程中断线,那么客户端将丢失在断线期间发送的所有消息。

3.7 其他命令

3.7.1 排序

排序
命令行为描述示例注释
SORT对列表、集合以及有序集合进行排序sort key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern …]] [ASC|DESC] [ALPHA] [STORE destination] BY pattern可以指定存储到其他key中的值作为比较条件。 参考文献:[Redis的排序命令Sort](https://blog.csdn.net/Tc_lccc/article/details/137624709)

3.7.2 过期时间

过期时间
命令行为描述示例
PERSIST移除键的过期时间persist key
TTL查看键距离过期还有多少秒ttl key
EXPIRE让给定的键在指定秒数后过期expire key seconds
EXPIREAT将键的过期时间设置为给定的unix的时间戳expireat key timestamp
PTTL查看键距离过期还有多少毫秒pttl key
EXPIRE让给定的键在指定毫秒数后过期expire key seconds
EXPIREAT将键的过期时间设置为给定的unix的时间戳【毫秒精度】expireat key timestamp

原文地址:https://blog.csdn.net/m0_50149847/article/details/144832736

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!