redisj介绍及安装配置
一、Redis介绍
Redis是一个开源(BSD许可)的内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。由于Redis采用运行在内存中的数据集工作方式,其性能卓越,能支持超过100K+每秒的读写频率。它支持多种类型的数据结构,如字符串(strings), 散列(hashes),列表(lists),集合(sets),有序集合(sorted sets)与范围查询和地理空间(geospatial)索引半径查询。Redis内置了复制(replication), LUA脚本(Lua scripting),LRU淘汰机制,事务实现(transactions),发布订阅(publish/subscribe)和不同级别的磁盘持久化(persistence)等能力, 并通过Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。
Redis的主要功能都是基于单线程网络模型实现,也就是说Redis使用一个线程来服务所有的客户端请求,同时Redis采用了非阻塞式IO,并精细地优化各种命令的算法和时间复杂度,大部分命令的算法都是O(1)的,具体可以看Redis命令参考。
另外Redis的大部分操作都是原子性的(简单的单线程模型),同时Redis还支持对几个操作全并后的原子性执行。列如:字符串(strings)的append命令;散列(hashes)的hincrby命令;列表(lists)的lpush命令;集合(sets)计算交集sinter命令,计算并集union命令和计算差集sdiff命令;或者在有序集合(sorted sets)里面获取成员的最高排名zrangebyscore命令等。
二、Redis应用场景
缓存
作为Key-Value形态的内存数据库,Redis 最先会被想到的应用场景便是作为数据缓存。而使用 Redis 缓存数据非常简单,只需要通过string类型将序列化后的对象存起来即可,不过也有一些需要注意的地方:
必须保证不同对象的 key 不会重复,并且使 key 尽量短,一般使用类名(表名)加主键拼接而成。 选择一个优秀的序列化方式也很重要,目的是提高序列化的效率和减少内存占用。 缓存内容与数据库的一致性,这里一般有两种做法: 只在数据库查询后将对象放入缓存,如果对象发生了修改或删除操作,直接清除对应缓存(或设为过期)。 在数据库新增和查询后将对象放入缓存,修改后更新缓存,删除后清除对应缓存(或设为过期)。 消息队列
Redis 中list的数据结构实现是双向链表,所以可以非常便捷的应用于消息队列(生产者 / 消费者模型)。消息的生产者只需要通过lpush将消息放入 list,消费者便可以通过rpop取出该消息,并且可以保证消息的有序性。如果需要实现带有优先级的消息队列也可以选择sorted set。而pub/sub功能也可以用作发布者 / 订阅者模型的消息。无论使用何种方式,由于 Redis 拥有持久化功能,也不需要担心由于服务器故障导致消息丢失的情况。
时间轴(Timeline)
list作为双向链表,不光可以作为队列使用。如果将它用作栈便可以成为一个公用的时间轴。当用户发完微博后,都通过lpush将它存放在一个 key 为LATEST_WEIBO的list中,之后便可以通过lrange取出当前最新的微博。
排行榜
使用sorted set和一个计算热度的算法便可以轻松打造一个热度排行榜,zrevrangebyscore可以得到以分数倒序排列的序列,zrank可以得到一个成员在该排行榜的位置(是分数正序排列时的位置,如果要获取倒序排列时的位置需要用zcard-zrank)。
计数器
计数功能应该是最适合 Redis 的使用场景之一了,因为它高频率读写的特征可以完全发挥 Redis 作为内存数据库的高效。在 Redis 的数据结构中,string、hash和sorted set都提供了incr方法用于原子性的自增操作,下面举例说明一下它们各自的使用场景:
如果应用需要显示每天的注册用户数,便可以使用string作为计数器,设定一个名为REGISTERED_COUNT_TODAY的 key,并在初始化时给它设置一个到凌晨 0 点的过期时间,每当用户注册成功后便使用incr命令使该 key 增长 1,同时当每天凌晨 0 点后,这个计数器都会因为 key 过期使值清零。 每条微博都有点赞数、评论数、转发数和浏览数四条属性,这时用hash进行计数会更好,将该计数器的 key 设为weibo:weibo_id,hash的 field 为like_number、comment_number、forward_number和view_number,在对应操作后通过hincrby使hash 中的 field 自增。 如果应用有一个发帖排行榜的功能,便选择sorted set吧,将集合的 key 设为POST_RANK。当用户发帖后,使用zincrby将该用户 id 的 score 增长 1。sorted set会重新进行排序,用户所在排行榜的位置也就会得到实时的更新。 好友关系
这个场景最开始是是一篇介绍微博 Redis 应用的 PPT 中看到的,其中提到微博的 Redis 主要是用在在计数和好友关系两方面上,当时对好友关系方面的用法不太了解,后来看到《Redis 设计与实现》中介绍到作者最开始去使用 Redis 便是希望能通过set解决传统数据库无法快速计算集合中交集这个功能。后来联想到微博当前的业务场景,确实能够以这种方式实现,所以姑且猜测一下:
对于一个用户 A,将它的关注和粉丝的用户 id 都存放在两个 set 中:
A:follow:存放 A 所有关注的用户 id A:follower:存放 A 所有粉丝的用户 id
那么通过sinter命令便可以根据A:follow和A:follower的交集得到与 A 互相关注的用户。当 A 进入另一个用户 B 的主页后,A:follow和B:follow的交集便是 A 和 B 的共同专注,A:follow和B:follower的交集便是 A 关注的人也关注了 B。
分布式锁
在 Redis 2.6.12 版本开始,string的set命令增加了三个参数:
EX:设置键的过期时间(单位为秒) PX:设置键的过期时间(单位为毫秒) NX | XX:当设置为NX时,仅当 key 存在时才进行操作,设置为XX时,仅当 key 不存在才会进行操作
由于这个操作是原子性的,可以简单地以此实现一个分布式的锁,例如:
set key "lock" EX 1 XX
如果这个操作返回false,说明 key 的添加不成功,也就是当前有人在占用这把锁。而如果返回true,则说明得了锁,便可以继续进行操作,并且在操作后通过del命令释放掉锁。并且即使程序因为某些原因并没有释放锁,由于设置了过期时间,该锁也会在 1 秒后自动释放,不会影响到其他程序的运行。
倒排索引
倒排索引是构造搜索功能的最常见方式,在 Redis 中也可以通过set进行建立倒排索引,这里以简单的拼音 + 前缀搜索城市功能举例:
假设一个城市北京,通过拼音词库将北京转为beijing,再通过前缀分词将这两个词分为若干个前缀索引,有:北、北京、b、be…beijin和beijing。将这些索引分别作为set的 key(例如:index:北)并存储北京的 id,倒排索引便建立好了。接下来只需要在搜索时通过关键词取出对应的set并得到其中的 id 即可。
三、安装
编译源程序
Download, extract and compile Redis with:
$ wget http://download.redis.io/releases/redis-4.0.2.tar.gz $ tar xzf redis-4.0.2.tar.gz $ cd redis-4.0.2 [root@master redis-4.0.2]# make [root@master redis-4.0.2]# make install #复制src目录下的几个文件到/usr/local/bin/
安装的会在/usr/local/bin/的目录下生成以下几个文件
Redis可执行文件
编译好的bin文件位于在源码的src目录下,均以redis-xxx命名。其中可执行的2进制文件共有5个:
n redis-benchmark #性能测试工具
n redis-check-aof #aof文件修复工具
n redis-check-dump # rdb文件检查工具
n redis-cli # 命令行客户端
n redis-server # redis 服务器
为便于管理,把上述文件复制到一个新目录下
[root@test161 redis-4.0.2]#mkdir -p /usr/local/redis [root@test161 redis-4.0.2]#cd /usr/local/bin [root@test161 redis-4.0.2]#cp redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server /usr/local/redis/
Redis的启动
方法1:直接启动
加上&号使redis以后台程序方式运行 redis-server &
#/usr/local/redis/redis-server &
方法2:指定配置文件启动
#/usr/local/redis/redis-server /usr/local/redis/etc/redis.conf
方法3:使用Redis启动脚本设置开机自启动
推荐在生产环境中使用启动脚本方式启动redis服务。启动脚本 redis_init_script 位于位于Redis的 /utils/ 目录下。
# ls /root/redis-4.0.2/utils/redis_init_script
修改redis_init_script
#!/bin/sh # # Simple Redis init.d script conceived to work on Linux systems # as it does use of the /proc filesystem. REDISPORT=6379 EXEC=/usr/local/redis/bin/redis-server CLIEXEC=/usr/local/redis/bin/redis-cli PIDFILE=/var/run/redis.pid CONF="/etc/redis/${REDISPORT}.conf" case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed" else echo "Starting Redis server..." $EXEC $CONF fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE does not exist, process is not running" else PID=$(cat $PIDFILE) echo "Stopping ..." $CLIEXEC -p $REDISPORT shutdown while [ -x /proc/${PID} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped" fi ;; *) echo "Please use start or stop as first argument" ;; esac
根据上面这个配置文件,做以下操作:
新建目录 /etc/redis用来存放Redis的配置文件
# mkdir /etc/redis # cp /root/redis-4.0.2/utils/redis_init_script /etc/init.d/redisd # cp /root/redis-4.0.2/redis.conf /etc/redis/6379.conf
修改6379.conf配置文件
# vim/etc/redis/6379.conf
daemonize yes
执行随系统自动启动命令
# chkconfig --add redisd
# service redisd start
Starting Redis server...
检测是否启动成功
1、检测后台进程是否存在
[root@test161 redis-4.0.2]# ps -ef | grep redis root 31156 1 0 16:11 ? 00:00:01 /usr/local/redis/bin/redis-server 127.0.0.1:6379 root 31164 2083 0 16:12 pts/0 00:00:00 /usr/local/redis/bin/redis-cli
2、检测6379端口是否在监听
[root@test161 redis-4.0.2]# netstat -tunpl |grep 6379 tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 31156/redis-server
3、使用redis-cli客户端检测连接是否正常
# /usr/local/redis/redis-cli 127.0.0.1:6379>
Redis的停止
n 退出客户端用Ctrl+C命令
n 在客户端下,执行SHUTDOWN,停止服务
n Kill -9 PID
n 使用脚本
[root@test161 redis-4.0.2]# service redisd stop Stopping ... Redis stopped
ervice redis does not support chkconfig的解决办法
问题解决办法如下:
必须把下面两行注释放在/etc/init.d/redis文件靠前的注释中:
# chkconfig:   2345 90 10 
# description:  Redis is a persistent key-value database 
上面的注释的意思是,redis服务必须在运行级2,3,4,5下被启动或关闭,启动的优先级是90,关闭的优先级是10。
redis启动警告问题:
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
这句话的翻译大概就是:对一个高负载的环境来说tcp设置128这个值,太小了,执行后如下,这个问题解决了
[root@micro1-redis01 ~]# vi /etc/sysctl.conf ........ net.core.somaxconn = 1024 [root@micro1-redis01 ~]# sysctl -p

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号