Redis简介

    2008年,一个名为Salvatore Sanfilippo的程序员为他开发的LLOOGG项目定制了专属的数据库(因为之前他无论怎样优化MySQL,系统性能已经无法再提升了),这项工作的成果就是Redis的初始版本。后来他将Redis的代码放到了全球最大的代码托管平台Github,从那以后,Redis引发了大量开发者的好评和关注,继而有数百人参与了Redis的开发和维护,这使得Redis的功能越来越强大和性能越来越好。

    Redis是REmote DIctionary Server的缩写,它是一个用ANSI C编写的高性能的key-value存储系统,与其他的key-value存储系统相比,Redis有以下一些特点(也是优点):

    • Redis的读写性能极高,并且有丰富的特性(发布/订阅、事务、通知等)。
    • Redis支持数据的持久化(RDB和AOF两种方式),可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
    • Redis支持多种数据类型,包括:string、hash、list、set,zset、bitmap、hyperloglog等。
    • Redis支持主从复制(实现读写分析)以及哨兵模式(监控master是否宕机并自动调整配置)。
    • Redis支持分布式集群,可以很容易的通过水平扩展来提升系统的整体性能。
    • Redis基于TCP提供的可靠传输服务进行通信,很多编程语言都提供了Redis客户端支持。

    Redis的应用场景

    1. 高速缓存 - 将不常变化但又经常被访问的热点数据放到Redis数据库中,可以大大降低关系型数据库的压力,从而提升系统的响应性能。
    2. 排行榜 - 很多网站都有排行榜功能,利用Redis中的列表和有序集合可以非常方便的构造各种排行榜系统。
    3. 商品秒杀/投票点赞 - Redis提供了对计数操作的支持,网站上常见的秒杀、点赞等功能都可以利用Redis的计数器通过+1或-1的操作来实现,从而避免了使用关系型数据的操作。
    4. 分布式锁 - 利用Redis可以跨多台服务器实现分布式锁(类似于线程锁,但是能够被多台机器上的多个线程或进程共享)的功能,用于实现一个阻塞式操作。
    5. 消息队列 - 消息队列和高速缓存一样,是一个大型网站不可缺少的基础服务,可以实现业务解耦和非实时业务削峰等特性,这些我们都会在后面的项目中为大家展示。

    Redis的安装和配置

    可以使用Linux系统的包管理工具(如yum)来安装Redis,也可以通过在Redis的下载Redis的源代码,解压缩解归档之后通过make工具对源代码进行构建并安装,在更新这篇文档时,Redis官方提供的最新稳定版本是Redis 5.0.10

    下载:

    解压缩和解归档:

    1. tar -zxf redis-5.0.10.tar.gz

    进入Redis源代码目录:

    1. cd redis-5.0.10

    构建和安装:

    1. make && make install

    在redis源代码目录下有一个名为redis.conf的配置文件,我们可以先查看一下该文件。

    1. vim redis.conf

    下面我们对Redis的配置文件进行一个扼要的介绍。

    配置Redis服务的IP地址和端口:

    配置底层有多少个数据库:

    配置Redis的持久化机制 - RDB。

    Redis概述 - 图3

    配置Redis的持久化机制 - AOF:

    Redis概述 - 图5

    配置访问Redis服务器的口令:

    配置Redis的主从复制(通过主从复制可以实现读写分离):

    Redis概述 - 图7

    配置慢查询:

    上面这些内容就是Redis的基本配置,如果你对上面的内容感到困惑也没有关系,先把Redis用起来再回头去推敲这些内容就行了。如果想找一些参考书,是一本不错的入门读物,而《Redis实战》是不错的进阶读物。

    Redis的服务器和客户端

    如果希望修改Redis的配置(如端口、认证口令、持久化方式等),可以通过下面两种方式。

    方式一:通过参数指定认证口令和AOF持久化方式。

    1. redis-server --requirepass yourpass --appendonly yes

    方式二:通过指定的配置文件来修改Redis的配置。

    1. redis-server /root/redis-5.0.10/redis.conf

    下面我们使用第一种方式来启动Redis并将其置于后台运行,将Redis产生的输出重定向到名为redis.log的文件中。

    1. redis-server --requirepass yourpass > redis.log &

    可以通过ps或者netstat来检查Redis服务器是否启动成功。

    1. ps -ef | grep redis-server
    2. netstat -nap | grep redis-server

    接下来,我们尝试用Redis命令行工具redis-cli去连接服务器,该工具默认连接本机的6379端口,如果需要指定Redis服务器和端口,可以使用-h-p参数分别进行指定。

    进入命令行工具后,就可以通过Redis的命令来操作Redis服务器,如下所示。

    1. 127.0.0.1:6379> auth yourpass
    2. OK
    3. 127.0.0.1:6379> ping
    4. PONG
    5. 127.0.0.1:6379>

    Redis有着非常丰富的数据类型,也有很多的命令来操作这些数据,具体的内容可以查看Redis命令参考,在这个网站上,除了Redis的命令参考,还有Redis的详细文档,其中包括了通知、事务、主从复制、持久化、哨兵、集群等内容。

    Redis概述 - 图9

    1. 127.0.0.1:6379> set username admin
    2. OK
    3. 127.0.0.1:6379> get username
    4. "admin"
    5. 127.0.0.1:6379> set password "123456" ex 300
    6. OK
    7. 127.0.0.1:6379> get password
    8. "123456"
    9. 127.0.0.1:6379> ttl username
    10. (integer) -1
    11. 127.0.0.1:6379> ttl password
    12. (integer) 286
    13. 127.0.0.1:6379> hset stu1 name hao
    14. (integer) 0
    15. 127.0.0.1:6379> hset stu1 age 38
    16. (integer) 1
    17. 127.0.0.1:6379> hset stu1 gender male
    18. (integer) 1
    19. 127.0.0.1:6379> hgetall stu1
    20. 1) "name"
    21. 2) "hao"
    22. 3) "age"
    23. 4) "38"
    24. 5) "gender"
    25. 127.0.0.1:6379> hvals stu1
    26. 1) "hao"
    27. 2) "38"
    28. 3) "male"
    29. 127.0.0.1:6379> hmset stu2 name wang age 18 gender female tel 13566778899
    30. OK
    31. 127.0.0.1:6379> hgetall stu2
    32. 1) "name"
    33. 3) "age"
    34. 4) "18"
    35. 5) "gender"
    36. 6) "female"
    37. 7) "tel"
    38. 8) "13566778899"
    39. 127.0.0.1:6379> lpush nums 1 2 3 4 5
    40. (integer) 5
    41. 127.0.0.1:6379> lrange nums 0 -1
    42. 1) "5"
    43. 2) "4"
    44. 3) "3"
    45. 4) "2"
    46. 5) "1"
    47. 127.0.0.1:6379> lpop nums
    48. "5"
    49. 127.0.0.1:6379> lpop nums
    50. "4"
    51. 127.0.0.1:6379> rpop nums
    52. "1"
    53. 127.0.0.1:6379> rpop nums
    54. "2"
    55. 127.0.0.1:6379> sadd fruits apple banana orange apple grape grape
    56. (integer) 4
    57. 127.0.0.1:6379> scard fruits
    58. (integer) 4
    59. 127.0.0.1:6379> smembers fruits
    60. 1) "grape"
    61. 2) "orange"
    62. 3) "banana"
    63. 4) "apple"
    64. 127.0.0.1:6379> sismember fruits apple
    65. (integer) 1
    66. 127.0.0.1:6379> sismember fruits durian
    67. (integer) 0
    68. 127.0.0.1:6379> sadd nums1 1 2 3 4 5
    69. (integer) 5
    70. 127.0.0.1:6379> sadd nums2 2 4 6 8
    71. (integer) 4
    72. 127.0.0.1:6379> sinter nums1 nums2
    73. 1) "2"
    74. 2) "4"
    75. 127.0.0.1:6379> sunion nums1 nums2
    76. 1) "1"
    77. 2) "2"
    78. 4) "4"
    79. 5) "5"
    80. 6) "6"
    81. 7) "8"
    82. 127.0.0.1:6379> sdiff nums1 nums2
    83. 1) "1"
    84. 2) "3"
    85. 127.0.0.1:6379> zadd topsinger 5234 zhangxy 1978 chenyx 2235 zhoujl 3520 xuezq
    86. (integer) 4
    87. 127.0.0.1:6379> zrange topsinger 0 -1 withscores
    88. 1) "chenyx"
    89. 2) "1978"
    90. 3) "zhoujl"
    91. 4) "2235"
    92. 5) "xuezq"
    93. 6) "3520"
    94. 7) "zhangxy"
    95. 8) "5234"
    96. 127.0.0.1:6379> zrevrange topsinger 0 -1
    97. 1) "zhangxy"
    98. 2) "xuezq"
    99. 3) "zhoujl"
    100. 4) "chenyx"
    101. 127.0.0.1:6379> zrevrank topsinger zhoujl
    102. (integer) 2
    103. 127.0.0.1:6379> geoadd pois 116.39738549206541 39.90862689286386 tiananmen
    104. (integer) 1
    105. 127.0.0.1:6379> geoadd pois 116.27172936413572 39.99135172904494 yiheyuan
    106. (integer) 1
    107. 127.0.0.1:6379> geoadd pois 117.27766503308104 40.65332064313784 gubeishuizhen
    108. (integer) 1
    109. 127.0.0.1:6379> geodist pois tiananmen gubeishuizhen km
    110. "111.5333"
    111. 127.0.0.1:6379> geodist pois tiananmen yiheyuan km
    112. "14.1230"
    113. 127.0.0.1:6379> georadius pois 116.86499108288572 40.40149669363615 50 km withdist
    114. 1) 1) "gubeishuizhen"
    115. 2) "44.7408"

    在Python程序中使用Redis

    可以使用pip安装名为redis的三方库,该三方库的核心是一个名为Redis的类,Redis对象代表一个Redis客户端,通过该客户端可以向Redis服务器发送命令并获取执行的结果。上面我们在Redis客户端中使用的命令基本上就是Redis对象可以接收的消息,所以如果了解了Redis的命令就可以在Python中玩转Redis。

    1. pip3 install redis

    进入Python交互式环境,使用redis三方库来操作Redis。

    1. >>> import redis
    2. >>>
    3. >>> client = redis.Redis(host='127.0.0.1', port=6379, password='yourpass')
    4. >>>
    5. >>> client.set('username', 'admin')
    6. True
    7. >>> client.hset('student', 'name', 'luohao')
    8. 1
    9. >>> client.hset('student', 'age', 40)
    10. 1
    11. >>> client.keys('*')
    12. [b'username', b'student']
    13. >>> client.get('username')
    14. b'admin'
    15. {b'name': b'luohao', b'age': b'40'}