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

 

 

 

 

 

posted @ 2017-10-24 16:05  Gringer  阅读(271)  评论(0)    收藏  举报