redis 数据库的使用场景介绍

redis 是 NoSQL 数据库中的一种,特别适合解决一些使用传统关系数据库难以解决的问题,redis 作为内存数据库,如果在不合适的场合,对内存的消耗是很大的,甚至会让系统难以承受。

数据通过两个角度来分类:
  通过大小:大数据、小数据
  通过热度分:冷数据、热数据(热数据是指读写比较频繁的数据,反之则是冷数据)

大体而言,redis 最适合处理的是 小而热 的数据,而且是读写频繁的热数据。对于大而热的数据,如果其他方式很难解决问题,也可以考虑使用 redis 解决,但是一定要非常谨慎,防止数据无限膨胀。

对于冷数据,无论大小,都不建议放在 redis 中,redis 数据要全部放在内存中,资源宝贵,把冷数据放在其中实在是一种资源浪费,冷数据建议放置在关系型数据库中,其次,对于热数据,尤其是写频繁的热数据,如果量比较小,是最适合放到 redis 中的。比如论坛最新发表列表,点赞数,可以控制在几百到几千内的规模,就是 redis 典型的应用。

对于量比较大的热数据,使用 redis 时一定要比较谨慎。这种类型数据很容易引起数据膨胀,导致 redis 消耗内存巨大,让系统难以承受。我这里就有一个教训:把用户关注后生成的token id 存储在 redis 中,每个新用户来都会生成一个token id,之后是不会变的。这是一种数据量极大,而且冷热不均匀的数据。在其中一次需要手动修改 redis 数据的时候,造成了 redis 无法访问,庆幸 redis 中的数据后端 MySQL 也有。用户登录如果 redis中没有就会去后端 MySQL获取,然后缓存在 redis 中,所以对于大量冷热不均的数据,一定要采用 普通存储 + 缓存的方式,缓存只是为了加速读取数据,减轻后端关系型数据库的压力。

redis在很多方面与其他数据解决方案不同:它使用内存提供主存储支持,而仅使用硬盘做持久性的存储;它的数据模型非常独特,用的是单线程。

 

redis 的安装

系统:CentOS Linux release 7.2.1511 (Core)
redis 版本:redis-3.2.6

1. 首先安装gcc之类的编译环境

# yum install gcc* -y

2. 安装 redis

# mkdir /usr/local/redis
# tar xf redis-3.2.6.tar.gz 
# cd redis-3.2.6
# make PREFIX=/usr/local/redis/ install
上面执行完毕,/usr/local/redis/bin/ 应该有如下的目录和文件
# ls /usr/local/redis/bin/
redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli  redis-sentinel  redis-server


redis主要命令注解:

redis-server     redis的服务端
redis-benchmark    用于进行redis性能测试的工具
redis-cli    redis的客户端
redis-check-rdb    用于修复出问题的rdb文件
redis-check-aof 用于修复出问题的AOF文件


3. 配置 redis 并启动

# mkdir -pv  /usr/local/redis/{conf,db,log}
mkdir: created directory ‘/usr/local/redis/conf’
mkdir: created directory ‘/usr/local/redis/db’
mkdir: created directory ‘/usr/local/redis/log’

# cp -a utils/redis_init_script /etc/init.d/redis
# cp -a redis.conf /usr/local/redis/conf/6379.conf


# vim /etc/init.d/redis
#!/bin/sh
#chkconfig: 2345 80 90    # 添加该行是为了设置成服务
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.


# chkconfig --add redis
# systemctl status redis
redis.service
   Loaded: loaded (/etc/rc.d/init.d/redis)
   Active: inactive (dead)

修改 redis 主配置文件 

# vim  /usr/local/redis/conf/6379.conf

 128 daemonize no # 修改为 daemonize yes 设置redis服务后台启动
 163 logfile ""    # 修改为 logfile "/usr/local/redis/log/redis.log" 设置redis日志文件
 247 dir ./ # 修改为  dir /usr/local/redis/db/ 设置 rdb 文件存储目录

保存退出

修改启动服务脚本:

  8 EXEC=/usr/local/bin/redis-server    # 修改为:EXEC=/usr/local/redis/bin/redis-server
  9 CLIEXEC=/usr/local/bin/redis-cli    # 修改为:CLIEXEC=/usr/local/redis/bin/redis-cli
 12 CONF="/etc/redis/${REDISPORT}.conf" # 修改为:CONF="/usr/local/redis/conf/${REDISPORT}.conf"
  61 bind 127.0.0.1    # 根据需要进行修改,这里修改为:

保存退出

将 redis 的命令添加到环境变量:

# echo "export PATH=$PATH:/usr/local/redis/bin" >> /etc/profile.d/redis.sh
# . /etc/profile.d/redis.sh


启动 redis 服务

# systemctl daemon-reload
# systemctl start redis
# systemctl status  redis
redis.service
   Loaded: loaded (/etc/rc.d/init.d/redis)
   Active: active (running) since Wed 2017-08-30 15:04:09 CST; 9s ago
   CGroup: /system.slice/redis.service
           └─5199 /usr/local/redis/bin/redis-server 127.0.0.1:6379

Aug 30 15:04:09 localhost.localdomain systemd[1]: Starting redis.service...
Aug 30 15:04:09 localhost.localdomain redis[5197]: Starting Redis server...
Aug 30 15:04:09 localhost.localdomain systemd[1]: Started redis.service.
Aug 30 15:04:16 localhost.localdomain systemd[1]: Started redis.service.

# netstat -ntplu | egrep redis
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      5231/redis-server 0

启动成功。

 

 

Redis 配置文件详解

redis 配置文件从整体上分为以下几个部分:

    1.通用(general)
    2.快照(snapshotting)
    3.复制(replication)
    4.安全(security)
    5.限制(limits)
    6.追加模式(append only mode)
    7.LUA脚本(lua scripting)
    8.慢日志(slow log)
    9.事件通知(event notification)

 

有些同学会问“如果redis不监听端口,还怎么与外界通信呢”,其实redis还支持通过unix socket方式来接收请求。可以通过unixsocket配置项来指定unix socket文件的路径,并通过unixsocketperm来指定文件的权限。
unixsocket /tmp/redis.sock
unixsocketperm 755

当一个redis-client一直没有请求发向server端,那么server端有权主动关闭这个连接,可以通过timeout来设置“空闲超时时限”,0表示永不关闭。
timeout 0

TCP连接保活策略,可以通过tcp-keepalive配置项来进行设置,单位为秒,假如设置为60秒,则server端会每60秒向连接空闲的客户端发起一次ACK请求,以检查客户端是否已经挂掉,对于无响应的客户端则会关闭其连接。所以关闭一个连接最长需要120秒的时间。如果设置为0,则不会进行保活检测。
tcp-keepalive 0

redis支持通过loglevel配置项设置日志等级,共分四级,即debug、verbose、notice、warning。
loglevel notice

edis也支持通过logfile配置项来设置日志文件的生成位置。如果设置为空字符串,则redis会将日志输出到标准输出。假如你在daemon情况下将日志设置为输出到标准输出,则日志会被写到/dev/null中。
logfile ""

如果希望日志打印到syslog中,也很容易,通过syslog-enabled来控制。另外,syslog-ident还可以让你指定syslog里的日志标志,比如:
syslog-ident redis

而且还支持指定syslog设备,值可以是USER或LOCAL0-LOCAL7。具体可以参考syslog服务本身的用法。
syslog-facility local0

对于redis来说,可以设置其数据库的总数量,假如你希望一个redis包含16个数据库,那么设置如下:
databases 16

这16个数据库的编号将是0到15。默认的数据库是编号为0的数据库。用户可以使用select <DBid>来选择相应的数据库。
【通用】

相关文章: