1.什么是Redis
Redis是由Salvatore Sanfilippo用C语言开发的一款开源的、高性能的键值对存储数据库,它采用 BSD 协议,为了适应不同场景下的存储需求,提供字符串、列表、有序集合、散列及集合等了多种键值数据类型。它内置复制、Lua脚本、LRU 收回、事务及不同级别磁盘持久化功能,同时通过 Redis Sentinel 实现高可用,通过 Redis Cluster 提供自动分区等相关功能。
2. Redis 的特性
●支持多种计算机编程语言,如 Java、C、C++、Python、PHP、Lua、Ruby、Node.js、C#、GoLand等。
● 具有丰富的数据类型,如 String、List、Set、Hash、Sorted Set 等。
● 支持多种数据结构,如哈希、集合、位图(多用于活跃用户数等的统计)、HyperLogLog(超小内存唯一值计数,由于只有12KB,因而是有一定误差范围的)、GEO(地理信息定位)。
● 读/写速度快,性能高。官方给出的数据是:Redis 能读的速度是110000次/s,写的速度是81000次/s。
●支持持久化。Redis 的持久化也就是备份数据,Redis 的持久化方式是RDB 和 AOF。
● 简单且功能强大。如利用 Redis 可以实现消息订阅发布、Lua 脚本、数据库事务、 Pipeline(管道,即当指令达到一定数量后,客户端才会执行)。同时 Redis是单线程的,它不依赖外部库,它的所有操作都是原子性的,使用简单。
● 实现高可用主从复制,主节点做数据副本。
● 实现分布式集群和高可用。Redis Cluster 支持分布式,进而可以实现分布式集群,Redis Sentinel 支持高可用。
3 .Redis 的使用场景
● 做缓存。使用Redis不需要每次都重新生成数据,而且它的缓存速度和查询速度比较快,使用也比较方便。比如,实现数据查询、缓存新闻消息内容、缓存商品内容或购物车等。
● 做计数器应用。Redis 的命令具有原子性,它提供了 INCR、DECR、GETSET、INCRBY 等相关命令来构建计数系统。
● 实现消息队列系统。Redis 运行稳定,速度快,支持模式匹配,可以实现消息订阅发布。Redis 还有阻塞队列的命令,能够让一个程序在执行时被另一个程序添加到队列中。
● 做实时系统、消息系统。可以利用 Redis 的 set 功能做实时系统来查看某个用户是否进行了某项操作,对其行为进行统计对比。也可以利用 Redis 的 Pub/Sub 构建消息系统,如在线聊天系统。
● 实现排行榜应用。排行榜的实现利用了 Redis 的有序集合。利用 Redis 的 ZADD、ZREVRANGE、ZRANK等命令可以轻松实现排名并获取排名的用户。
● 做数据过期处理。将 sorted set 的 score 值设置成过期时间的时间戳,然后通过过期时间排序,找出过期的数据进行删除。可以采用过期属性来确认一个关键字在什么时候应该被删除。也可以利用UNIX 时间作为关键字,将列表按时间排序。对 currenttime和 timeto_live 进行检索,查询出过期的数据,进而删除。
● 做大型社交网络。采用 Redis 可以很好地与社交网络相结合。
●分布式集群架构中的 session 分离。采用分布式集群部署可以满足一个 Web 应用系统被大规模访问的需要。而要实现分布式集群部署,就要解决 session统一的问题。
通常可以采用 Redis 来实现 session 共享机制,以达到 session统一的目的。
4. Linux 系统下搭建Redis 环境
第一步:在Linux系统可连接网络的情况下,可以使用命令:
wget http://download.redis.io/releases/redis-4.0.9.tar.gz下载Redis的tar包到相应的文件夹在Linux系统不可连接网络的情况下,可以通过
http://download.redis.io/releases/redis-4.0.9.tar.gz下载Redis的tar包,然后使用文件传输工具上传到Linux系统的相应的文件夹
第二步:使用命令:tar -zxvf redis-4.0.9.tar.gz解压缩安装包 ,解压 完 成后使用命令:cd redis-4.0.9进入这个文件夹
第三步:使用命令:make进行安装 ,安装完成后在目录下会出现编译后的 Redis 服务程序redis-server和用于测试的客户端程序redis-cli
注意:使用make命令安装后想要执行Redis的命令操作,只能到其安装目录下的src路径下执行相关命令,如果想要在任意目录下执行Redis的相关命令(即设置Redis的全局命令操作),还需要再执行命令:make install在/usr/local/bin目录下生成redis-server和redis-cli等文件即可
第四步:使用命令:cd src进入src目录后输入命令:./redis-server来启动Redis服务,如图所示:
注意:
(1)如果设置了Redis的全局命令操作,使用命令:redis-server来启动Redis服务
(2)如果Redis的配置文件不需要修改则在./redis-server命令后不需要添加Redis配置文件的绝对路径,如果修改了其配置文件则在./redis-server命令后面需要添加Redis的配置的绝对路径
说明:在使用 make 命令安装 Redis 时有可能会报错:
(1)找不到gcc命令,原因是没有安装 GCC编译器
使用命令:yum install
gcc -y安装GCC编译器,使用命令:make distclean清理上次执行 make 命令所产生的文件,再次执行make命令
(2)error:jemalloc/jemalloc.h: No such file or directory。
没有找到 jemalloc.h头文件,使用命令:make MALLOC=libc解决
5. Linux 系统下Redis 的启动与关闭
(1)前台启动
切换到Redis的src目录下使用命令:./redis-server启动Redis,然后开启新窗口,使用命令:ps -ef | grep redis查看 Redis 的进程,如图所示:
前台启动Redis按Ctrl+C 组合键退出或者直接关闭连接,可以关闭Redis 服务器
(2)后台启动
切换到 Redis 的 src 目录下使用命令:./redis-server &启动 Redis ,按 Ctrl+C 组合键退出或者关闭连接,再次查看Redis 的进程,也能看到 Redis正在运行。推荐使用后台启动方式。 此时关闭 Redis 有如下两种方式,一个是使用命令:kill pid 或kill -9 pid(不推荐使用),另一个是切换到redis的src目录下使用命令:./redis-cli shutdown进行关闭。
使用命令:nohup./redis-server &后台启动Redis并输出日志到指定文件,如图所示:
然后使用命令:ls命令查看,将会看到 nohup.out文件,使用命令:cat nohup.out打开并查看启动日志,后面产生的操作日志也会输出到这个文件中
6. Redis 客户端
(1)命令行客户端
Redis 的命令行客户端 redis-cli是Redis自带的基于命令行的客户端,主要用于与服务器端进行交互,可以使用该客户端来操作Redis的各种命令。切换到 redis/redis-4.0.9/src 目录下,输入命令启动 Redis 的命令行客户端。有 3 种形式的启动命令:
● 命令 1:./redis-cli(不指定启动端口)。
● 命令 2:./redis-cli -p 6379(指定启动端口)。
● 命令 3:./redis-cli -h 127.0.0.1 -p 6379(指定 IP 和启动端口)
(2)RDM可视化客户端
RedisDesktopManager(RDM)可视化工具能够帮助用户查看Redis 数据库中的数据,可以连接远程 Redis 数据库进行操作,下载地址:https://redisdesktop.com/download。
在使用RDM图形客户端远程连接Redis 服务器时,需要修改Redis 目录下的 redis.conf配置文件:
● bind 127.0.0.1:表示只能连接本机 Redis 服务,除此之外不能连接,需要注释掉
● protected -mode yes:表示受保护模式,不能连接外界客户端,要将yes改为no
● requirepass foobared:表示用户登录的密码,取消掉注释后修改为自己的密码
配置文件修改并保存以后,需要重新启动Redis服务
注意:开启远程连接还需要保证Redis配置文件中的daemonize为yes状态
(3)Redis的Java编程客户端
● Jedis:它是一个很小、很健全的 Redis 客户端,Java 借助 Jedis 客户端实现对 Redis的各种操作。推荐使用。
Jedis 是开源的,源代码地址:https://github.com/xetorthio/jedis。
Jedis 的 API 文档地址:http://xetorthio.github.io/jedis/。
● Lettuce:它是一个可伸缩、线程安全的Redis 客户端,多个线程可以共享同一个 redisConnection。它利用优秀的 Netty NIO 框架来高效管理 Redis 的多个连接。
Lettuce 源代码地址:https://github.com/lettuce-io/lettuce-core。