美文网首页
Redis简明教程

Redis简明教程

作者: super_pcm | 来源:发表于2019-09-29 14:14 被阅读0次

    一直想写一篇关于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.

    相关文章

      网友评论

          本文标题:Redis简明教程

          本文链接:https://www.haomeiwen.com/subject/ogndectx.html