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>来选择相应的数据库。