vlambda博客
学习文章列表

rodert单排学习redis入门【黑铁】

[toc]  

前言


声明:参考来源互联网,有任何争议可以留言。站在前人的肩上,我们才能看的更远。

有任何问题都可以来谈谈 !

rodert单排学习redis入门【黑铁】

本篇主要是 Redis 的入门,涉及一些基础命令和常见场景。

redis是目前最热的缓存组件之一,如果你还不懂,那就开始,入门到实战

本文主要是 Redis 入门知识,介绍 Redis 特性、使用场景、安装和数据类型。

中文官网:http://www.redis.cn/

1.NoSql(not only sql)

指非关系型数据库,不支持sql语句,nosql中存储的数据是KV形式

常见的NoSQL产品有:Mongodb、Redis、Hbase hadoop、Cassandra hadoop。

2.Redis入门

rodert单排学习redis入门【黑铁】

这是一些redis介绍,做一些简单了解即可。

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis 的开发由Pivotal赞助。

redis 是一个 key-value 存储系统。和 Memcached 类似,它支持存储的 value 类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis 支持各种不同方式的排序。与 memcached 一样,为了保证效率,数据都是缓存在内存中。区别的是 Redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave(主从)同步。

Redis 是一个高性能的key-value数据库。Redis 的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。Redis 支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得 Redis 可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

3.Redis特性

3.1.性能

下面是官方的bench-mark数据:测试完成了 50 个并发执行 100000 个请求。设置和获取的值是一个 256 字节字符串。Linux box 是运行 Linux 2.6 , 这是 X3320 Xeon 2.5 ghz。文本执行使用 loopback 接口(127.0.0.1)。结果:读的速度是 110000次/s ,写的速度是 81000次/s 。

3.2.特性

  1. Redis 与其他 key-value 缓存产品有以下三个特点:

  2. Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

  3. Redis 不仅仅支持简单的 key-value类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。

  4. Redis 支持数据的备份,即 master-slave 模式的数据备份。

3.3.优势

  • 性能极高 – Redis 能读的速度是110000次/s,写的速度是81000次/s 。

  • 丰富的数据类型 – Redis 支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。

  • 原子 – Redis 的所有操作都是原子性的,同时Redis 还支持对几个操作全并后的原子性执行。

  • 丰富的特性 – Redis 还支持 publish/subscribe, 通知, key 过期等等特性。

4.Redis使用场景

目前在互联网公司, Redis 使用非常广泛,我日常工作中,会用它做爬虫采集系统中队列使用,还有在后台管理系统中做分布式,存储 token 使用。

1、缓存

缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力。Redis 提供了键过期功能,也提供了灵活的键淘汰策略,所以,现在 Redis 用在缓存的场合非常多。

2、排行榜

很多网站都有排行榜应用的,如京东的月度销量榜单、商品按时间的上新排行榜等。Redis 提供的有序集合数据类构能实现各种复杂的排行榜应用。

3、计数器

什么是计数器,如电商网站商品的浏览量、视频网站视频的播放数等。为了保证数据实时效,每次浏览都得给+1,并发量高时如果每次都请求数据库操作无疑是种挑战和压力。Redis 提供的 incr 命令来实现计数器功能,内存操作,性能非常好,非常适用于这些计数场景。

4、分布式会话

集群模式下,在应用不多的情况下一般使用容器自带的 session 复制功能就能满足,当应用增多相对复杂的系统中,一般都会搭建以 Redis 等内存数据库为中心的 session 服务,session 不再由容器管理,而是由 session 服务及内存数据库管理。

5、分布式锁

在很多互联网公司中都使用了分布式技术,分布式技术带来的技术挑战是对同一个资源的并发访问,如全局ID、减库存、秒杀等场景,并发量不大的场景可以使用数据库的悲观锁、乐观锁来实现,但在并发量高的场合中,利用数据库锁来控制资源的并发访问是不太理想的,大大影响了数据库的性能。可以利用 Redis 的setnx功能来编写分布式的锁,如果设置返回1说明获取锁成功,否则获取锁失败,实际应用中要考虑的细节要更多。

6、社交网络

点赞、踩、关注/被关注、共同好友等是社交网站的基本功能,社交网站的访问量通常来说比较大,而且传统的关系数据库类型不适合存储这种类型的数据,Redis提供的哈希、集合等数据结构能很方便的的实现这些功能。

7、最新列表

Redis列表结构,LPUSH可以在列表头部插入一个内容ID作为关键字,LTRIM可用来限制列表的数量,这样列表永远为N个ID,无需查询最新的列表,直接根据ID去到对应的内容页即可。

8、消息系统

消息队列是大型网站必用中间件,如ActiveMQ、RabbitMQ、Kafka 等流行的消息队列中间件,主要用于业务解耦、流量削峰及异步处理实时性低的业务。Redis 提供了发布/订阅及阻塞队列功能,能实现一个简单的消息队列系统。另外,这个不能和专业的消息中间件相比。



5.安装

5.1.单机安装

5.1.1.windows下

redis 开源在 github 上

  • 下载,解压

Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip压缩包到 C 盘,解压后,将文件夹重新命名为 redis。

  • 运行

解压后,打开 cmd 窗口,cd 切换到 redis根目录下。

redis-server.exe redis.windows.conf

  • 客户端连接

不要关闭原 cmd 窗口,新打开一个 cmd 窗口,切换到 redis 根目录

redis-cli.exe -h 127.0.0.1 -p 6379

6379 是 redis 默认端口,我们可以在配置中修改

  • 测试

设置 key 值

set myKey abc

取出 key 值

get myKey

5.1.2.linux下

linux 和 windows 下类似,启动方式参考上文

 
   
   
 
  1. $ wget http://download.redis.io/releases/redis-2.8.17.tar.gz

  2. $ tar xzf redis-2.8.17.tar.gz

  3. $ cd redis-2.8.17

  4. $ make

6.五类数据结构

6.0.说明

类型中会涉及到很多的 Redis 操作命令,一定耐心看完,优化的基础是要了解。

6.1.介绍

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

redis是非常优秀的缓存工具,熟练使用redis,可以让我们的开发进一步。

对于下面操作,可以通过 redis-cli 工具连接使用

6.2.Redis keys

关于key的几条规则,一定不要以为它们不重要,了解一些对你排查问题至关重要。

Redis key 值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如”foo”的简单字符串到一个 JPEG 文件的内容都可以。空字符串也是有效 key 值。

关于key的几条规则:

  • 太长的键值不是个好主意,例如1024字节的键值就不是个好主意,不仅因为消耗内存,而且在数据中查找这类键值的计算成本很高。

  • 太短的键值通常也不是好主意,如果你要用”u:1000:pwd”来代替”user:1000:password”,这没有什么问题,但后者更易阅读,并且由此增加的空间消耗相对于key objectvalue object本身来说很小。当然,没人阻止您一定要用更短的键值节省一丁点儿空间。

  • 最好坚持一种模式。例如:”object-type:uid:field”就是个不错的注意,像这样”user:1000:password”。我喜欢对多单词的字段名中加上一个点,就像这样:”comment:q1234:reply.to”。

6.2.字符串(strings)

二进制安全的字符串

字符串方式是redis最简单的数据类型,redis就像一个可以持久化的memcached服务器。

  • 基本的操作方式get 和 set 方式

 
   
   
 
  1. > set mykey somevalue

  2. OK

  3. > get mykey

  4. "somevalue"

例如:当key存在时,set会失败。值的长度不能超过512MB。

  • 一个有趣的操作,原子递增,

 
   
   
 
  1. > set counter 100

  2. OK

  3. > incr counter

  4. (integer) 101

  5. > incr counter

  6. (integer) 102

  7. > incrby counter 50

  8. (integer) 152

INCR  命令将字符串解析成整型,将其加一,再将结果保存成新的字符串,类似的命令还有 INCRBY , DECRDECRBY

还有一个有趣的命令, GETSET 命令:设置新值,返回原值。这个操作有什么用?在我们需要保证原子性操作时

MSET 和 MGET 是批量操作

 
   
   
 
  1. > mset a 10 b 20 c 30

  2. OK

  3. > mget a b c

  4. 1) "10"

  5. 2) "20"

  6. 3) "30"

MGET 命令返回由值组成的数组。

  • 修改和查询存在操作

exists:判断键是否存在,del:删除指定键

 
   
   
 
  1. > set mykey hello

  2. OK

  3. > exists mykey

  4. (integer) 1

  5. > del mykey

  6. (integer) 1

  7. > exists mykey

  8. (integer) 0

TYPE 命令返回key对应的存储类型

 
   
   
 
  1. > set mykey x

  2. OK

  3. > type mykey

  4. string

  5. > del mykey

  6. (integer) 1

  7. > type mykey

  8. none

  • Redis超时

key 设置超时。精度可以使用毫秒或秒。

 
   
   
 
  1. > set key some-value

  2. OK

  3. > expire key 5

  4. (integer) 1

  5. > get key (immediately)

  6. "some-value"

  7. > get key (after some time)

  8. (nil)

使用了 EXPIRE 来设置超时时间(也可以再次调用这个命令来改变超时时间,使用 PERSIST 命令去除超时时间 )。我们也可以在创建值的时候设置超时时间:

 
   
   
 
  1. > set key 100 ex 10

  2. OK

  3. > ttl key

  4. (integer) 9

TTL 命令用来查看key对应的值剩余存活时间。

6.3.列表(Lists)

值得注意的:Redis lists 基于 Linked Lists 实现。

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

  • Redis Lists 入门

 
   
   
 
  1. > rpush mylist A

  2. (integer) 1

  3. > rpush mylist B

  4. (integer) 2

  5. > lpush mylist first

  6. (integer) 3

  7. > lrange mylist 0 -1

  8. 1) "first"

  9. 2) "A"

  10. 3) "B"

从右边(尾部)插入俩个元素,左边(头部)插入一个元素,LRANGE 打印所有(0,-1)元素。

  • Redis Lists常用指令

BLPOP key1 [key2 ] timeout 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

BRPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

BRPOPLPUSH source destination timeout 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它;如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

LINDEX key index 通过索引获取列表中的元素

LINSERT key BEFORE|AFTER pivot value 在列表的元素前或者后插入元素

说明:Redis Linsert 命令用于在列表的元素前或者后插入元素。当指定元素不存在于列表中时,不执行任何操作。当列表不存在时,被视为空列表,不执行任何操作。如果 key 不是列表类型,返回一个错误。

实例:

 
   
   
 
  1. redis> RPUSH mylist "Hello"

  2. (integer) 1

  3. redis> RPUSH mylist "World"

  4. (integer) 2

  5. redis> LINSERT mylist BEFORE "World" "There"

  6. (integer) 3

  7. redis> LRANGE mylist 0 -1

  8. 1) "Hello"

  9. 2) "There"

  10. 3) "World"

  11. redis>

LLEN key 获取列表长度

LPOP key 移出并获取列表的第一个元素

LPUSH key value1 [value2] 将一个或多个值插入到列表头部

LPUSHX key value 将一个值插入到已存在的列表头部

LRANGE key start stop 获取列表指定范围内的元素

LREM key count value 移除列表元素

 
   
   
 
  1. count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT

  2. count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。

  3. count = 0 : 移除表中所有与 VALUE 相等的值。

LSET key index value 通过索引设置列表元素的值

LTRIM key start stop 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。

 
   
   
 
  1. 注意:下标从0开始

RPOP key 移除列表的最后一个元素,返回值为移除的元素。

RPOPLPUSH source destination 移除列表的最后一个元素,并将该元素添加到另一个列表并返回。

RPUSH key value1 [value2] 在列表中添加一个或多个值

RPUSHX key value 为已存在的列表添加值

6.4.哈希(Hash)

Redis hash 是一个 string 类型的 field value 的映射表,hash 特别适合用于存储对象。

Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

 
   
   
 
  1. 序号 命令及描述

  2. 1 HDEL key field1 [field2]

  3. 删除一个或多个哈希表字段

  4. 2 HEXISTS key field

  5. 查看哈希表 key 中,指定的字段是否存在。

  6. 3 HGET key field

  7. 获取存储在哈希表中指定字段的值。

  8. 4 HGETALL key

  9. 获取在哈希表中指定 key 的所有字段和值

  10. 5 HINCRBY key field increment

  11. 为哈希表 key 中的指定字段的整数值加上增量 increment 。

  12. 6 HINCRBYFLOAT key field increment

  13. 为哈希表 key 中的指定字段的浮点数值加上增量 increment 。

  14. 7 HKEYS key

  15. 获取所有哈希表中的字段

  16. 8 HLEN key

  17. 获取哈希表中字段的数量

  18. 9 HMGET key field1 [field2]

  19. 获取所有给定字段的值

  20. 10 HMSET key field1 value1 [field2 value2 ]

  21. 同时将多个 field-value (域-值)对设置到哈希表 key 中。

  22. 11 HSET key field value

  23. 将哈希表 key 中的字段 field 的值设为 value 。

  24. 12 HSETNX key field value

  25. 只有在字段 field 不存在时,设置哈希表字段的值。

  26. 13 HVALS key

  27. 获取哈希表中所有值。

  28. 14 HSCAN key cursor [MATCH pattern] [COUNT count]

  29. 迭代哈希表中的键值对。

参考:https://www.runoob.com/redis/redis-hashes.html

6.5.集合(Set)

Redis 的 Set String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis 中集合 是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

 
   
   
 
  1. 序号 命令及描述

  2. 1 SADD key member1 [member2]

  3. 向集合添加一个或多个成员

  4. 2 SCARD key

  5. 获取集合的成员数

  6. 3 SDIFF key1 [key2]

  7. 返回给定所有集合的差集

  8. 4 SDIFFSTORE destination key1 [key2]

  9. 返回给定所有集合的差集并存储在 destination

  10. 5 SINTER key1 [key2]

  11. 返回给定所有集合的交集

  12. 6 SINTERSTORE destination key1 [key2]

  13. 返回给定所有集合的交集并存储在 destination

  14. 7 SISMEMBER key member

  15. 判断 member 元素是否是集合 key 的成员

  16. 8 SMEMBERS key

  17. 返回集合中的所有成员

  18. 9 SMOVE source destination member

  19. member 元素从 source 集合移动到 destination 集合

  20. 10 SPOP key

  21. 移除并返回集合中的一个随机元素

  22. 11 SRANDMEMBER key [count]

  23. 返回集合中一个或多个随机数

  24. 12 SREM key member1 [member2]

  25. 移除集合中一个或多个成员

  26. 13 SUNION key1 [key2]

  27. 返回所有给定集合的并集

  28. 14 SUNIONSTORE destination key1 [key2]

  29. 所有给定集合的并集存储在 destination 集合中

  30. 15 SSCAN key cursor [MATCH pattern] [COUNT count]

  31. 迭代集合中的元素

参考:https://www.runoob.com/redis/redis-sets.html

6.6.有序集合(sorted set)

  1. Redis 有序集合 集合 一样也是 string 类型元素的集合,且不允许重复的成员。

  2. 不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

  3. 有序集合的成员是唯一的,但分数(score)却可以重复。

  4. 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。


 
   
   
 
  1. 序号 命令及描述

  2. 1 ZADD key score1 member1 [score2 member2]

  3. 向有序集合添加一个或多个成员,或者更新已存在成员的分数

  4. 2 ZCARD key

  5. 获取有序集合的成员数

  6. 3 ZCOUNT key min max

  7. 计算在有序集合中指定区间分数的成员数

  8. 4 ZINCRBY key increment member

  9. 有序集合中对指定成员的分数加上增量 increment

  10. 5 ZINTERSTORE destination numkeys key [key ...]

  11. 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中

  12. 6 ZLEXCOUNT key min max

  13. 在有序集合中计算指定字典区间内成员数量

  14. 7 ZRANGE key start stop [WITHSCORES]

  15. 通过索引区间返回有序集合指定区间内的成员

  16. 8 ZRANGEBYLEX key min max [LIMIT offset count]

  17. 通过字典区间返回有序集合的成员

  18. 9 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]

  19. 通过分数返回有序集合指定区间内的成员

  20. 10 ZRANK key member

  21. 返回有序集合中指定成员的索引

  22. 11 ZREM key member [member ...]

  23. 移除有序集合中的一个或多个成员

  24. 12 ZREMRANGEBYLEX key min max

  25. 移除有序集合中给定的字典区间的所有成员

  26. 13 ZREMRANGEBYRANK key start stop

  27. 移除有序集合中给定的排名区间的所有成员

  28. 14 ZREMRANGEBYSCORE key min max

  29. 移除有序集合中给定的分数区间的所有成员

  30. 15 ZREVRANGE key start stop [WITHSCORES]

  31. 返回有序集中指定区间内的成员,通过索引,分数从高到低

  32. 16 ZREVRANGEBYSCORE key max min [WITHSCORES]

  33. 返回有序集中指定分数区间内的成员,分数从高到低排序

  34. 17 ZREVRANK key member

  35. 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序

  36. 18 ZSCORE key member

  37. 返回有序集中,成员的分数值

  38. 19 ZUNIONSTORE destination numkeys key [key ...]

  39. 计算给定的一个或多个有序集的并集,并存储在新的 key 中

  40. 20 ZSCAN key cursor [MATCH pattern] [COUNT count]

  41. 迭代有序集合中的元素(包括元素成员和元素分值)

7.Redis常用

如果你读到在这里,相信你对 Redis 已经有了一定了解,入门就先简单学到这里,下篇一起上青铜

后面的篇章,还将继续介绍 Redis 的一些高级用法,缓存击穿、缓存雪崩,源码分析等。看后不忘三连,还有需要更多技术博文可以留言催更。