Redis简明教程

2019-09-29  本文已影响0人  super_pcm

一直想写一篇关于Redis的教程,给自己对Redis的学习做个总结。这里写一个简明教程,大概简述下Redis是什么,有什么特性,可以做什么,怎么去运维和监控。


1. Redis是什么

初次接触Redis大概是在18年,那时候只知到Redis是一套缓存系统,可以缓存数据库的查询结果,可以缓存session,可以用来替换memcached。深入学习之后才发现Redis可以做的事情可多了,但是最常见的应用场景估计还是缓存。

1.1 Redis的定义

Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。
这是从Redis中文网找到的Redis的定义。这里分开来解析下:

  1. Redis是基于内存的,所以它很快。
  2. Redis有多种数据结构,这就是它和memcached的一个不同,memcached只支持string类型,而Redis还支持哈希、列表、集合、有序集合以及在这个基础上衍生的更多的数据类型。
  3. 因为多样的数据类型,Redis可以用来做数据库、高速缓存甚至是消息队列。

1.2 Redis的特性

  1. Redis是单线程的,虽然是单线程,但是它很快。并且因为它的单线程特性,所以服务端处理模型也非常简单,不用考虑并发的冲突。
  2. 比起memcache,Redis支持多种的数据机构,并且还可以做持久化。持久化的方式有RDB和AOF两种。
  3. Redis还支持主从复制,可以做集群。
  4. 快,非常快。主要是由于基于内存以及单线程的特性,官方给出的读写性能可以达到10万/秒。

1.3 Redis的应用场景

  1. 缓存:和Memcached一样,用来缓存数据库查询的结果。
  2. 排行榜系统:这是由于其有序集合的数据类型。
  3. 社交网络:这是由于集合类型,可以做集合运算。
  4. 消息队列:Redis提供了发布订阅功能和阻塞队列的功能。虽然在功能性上比不上专业的消息队列,但是基本的需求还是可以满足的。

2. Redis的数据结构

Redis支持多种的数据结构,这里做个大概的介绍。

2.1 string(字符串)

字符串是Redis中最基础的数据类型,可以简单认为这是一个键值对。字符串类型的值可以是字符串、数字甚至是二进制,最大不能超过512M。常用的命令包括:

##设置及获取键值
set key value
get key 
#删除
del key
##批量设置和获取键值
mset key value
mget key
##自增自减
incr key
decr key

字符串类型的应用常见通常为缓存系统,这就是和memcached一样的地方。此外,Redis还适合做计数器,因为它的自增和自减的性能非常高。

2.2 hash(哈希)

Redis的哈希数据类型与python中的字典基本一致,这是一个键值对的结构,形如value={{field1,value1},...{fieldN,valueN}}。在这里说的value指的是field(字段)的值,而不是key的值,需要和前面的字符串类型做区别。常用的命令包括:

##设置和获取键值
hset key field value
hget key field
##删除
hdel key field
##计算field个数
hlen key
##批量设置和获取键值
hmget key field
hmset key field
##获取所有的键、值和键值
hkeys key
hvals key
hgetall key

哈希数据类型可以明显看出是基于字符串类型的,所以哈希也可以用在缓存的场景下的,并且有更高的压缩率。此外由于哈希数据类型增加字段非常简单,如果用来替换关系型数据库,最大的优点就是增加字段几乎不花时间。

2.3 list(列表)

这是一个双向的链表,两端都可以pop和push数据。就是说它可以充当栈和队列的角色。LPUSH然后LPOP那就是后进先出,这就是栈,LPUSH然后RPOP那就是先进先出,这就是队列,这是消息队列的基础。常见的命令如下:

##增、删、查、改
lpush key value
rpush key value
lpop key
rpop key
lrange key start end
lset key index newValue
##阻塞操作
blpop key [key ...] timeout
brpop key [key ...] timeout

blpop和brpop是lpop和rpop的阻塞版本,在列表为空的时候:如果timeout=3,那么客户端要等到3秒后返回,如果timeout=0,那么客户端一直阻塞等下去。这种情况是不是很容易想到消息队列呢?

列表类型的应用场景如上面多次提到的消息队列,另外它还很适合做文章的列表,毕竟本来就叫做列表类型嘛。

2.4 set(集合)

集合就是和数学中的集合一样,就是说它能够支持对应的集合运算。对比列表类型,集合类型最大的不同就是它里面的数据是乱序的,不能通过索引下标获取元素,并且要求里面的所有数据都不能重复,必须唯一。常见的命令如下:

2.4.1 集合内操作

#增、删
sadd key element
srem key element
#计算元素个数
scard key
#判断元素是否在集合中
sismember key element
#随机返回元素
srandmember key [count]
#从集合随机弹出元素
spop key
#获取所有元素
smembers key

2.4.2 集合间操作

#交集
sinter key [key ...]
#并集
suinon key [key ...]
#差集
sdiff key [key ...]

很明显的数据特点,我们可以用集合运算来发现不同用户的相同兴趣。

2.5 sorted set(有序集合)

在集合的基础上,我们给每个元素加上分数,然后就可以用分数来做排序了。在有序集合中,元素不可以重复,但是元素可以重复,毕竟一个班级里面考试分数相同也很正常。有序集合的常用命令如下:

2.5.1 集合内

#添加成员
zadd key score member
#计算成员个数
zcard key
#计算某个成员的分数
zscore key member
#计算成员的排名
zrank key member
zrevrank key member
#删除成员
zrem key member #
#增加成员的分数
zincrby key increment member
#返回指定排名范围的成员
zrange key start end [withscores]
zrevrange key start end [withscores]
#返回指定分数范围的成员
zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key max min [withscores] [limit offset count]

2.5.2 集合间的操作

#交集
zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
#并集
zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]

有了分数,这很明显用来做排行榜就很合适了。

2.6 其他数据类型

Redis在这几个基础数据类型的上衍生了其他的数据结构,比如位图hyperloglogs 等等,这里不做介绍。有兴趣可以点击链接查看。

3.

上一篇下一篇

猜你喜欢

热点阅读