如何在Linux下Redis安装

redis作为NoSQL数据库的一种应用,响应速度和命中率上还是比较高效的。项目中需要用集中式可横向扩展的缓存框架,做了一点调研,即便 redis、memcached存在效率上的差异(具体比较参考http://timyang.net/data/mcdb-tt-redis/),但其实都能满足目前项目的需求;但是redis还是比较风骚的,支持链表和集合操作,支持正则表达式查找key,目前项目缓存的结果大多是链表,如果链表新增或者修改数据的话,redis就体现出了极大的优势(memcached只能重新加载链表,redis可以对链表新增或者修改)

1:下载redis

wget http://download.redis.io/releases/redis-5.0.9.tar.gz

 

2:安装redis
下载后解压 tar zxvf redis-1.2.6.tar.gz 到任意目录,例如/usr/local/redis-5.0.9

解压后,进入redis目录

cd /usr/local/redis-5.0.9

make 

make install

拷贝文件

进/usr/local/redis-5.0.9

cp redis.conf /etc/ 这个文件时redis启动的配置文件

再进/src

cp redis-benchmark redis-cli redis-server /usr/bin/ #这个倒是很有用,这样就不用再执行时加上./了,而且可以在任何地方执行


设置内存分配策略(可选,根据服务器的实际情况进行设置)

cat /proc/sys/vm/overcommit_memory

可选值:0、1、2。

sysctl vm.overcommit_memory=1

0,表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1,表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2,表示内核允许分配超过所有物理内存和交换空间总和的内存

值得注意的一点是,redis在dump数据的时候,会fork出一个子进程,理论上child进程所占用的内存和parent是一样的,比如parent 占用的内存为8G,这个时候也要同样分配8G的内存给child,如果内存无法负担,往往会造成redis服务器的down机或者IO负载过高,效率下降。所以这里比较优化的内存分配策略应该设置为 1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)
 

开启redis端口,修改防火墙配置文件
    vi /etc/sysconfig/iptables  

加入端口配置
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT  

重新加载规则
    service iptables restart   

3:启动redis服务
    [root@Architect redis-1.2.6]# pwd  
    /usr/local/redis-1.2.6  
    [root@Architect redis-1.2.6]# redis-server /etc/redis.conf  

查看进程,确认redis已经启动

    [root@Architect redis-1.2.6]# ps -ef | grep redis  
    root       401 29222  0 18:06 pts/3    00:00:00 grep redis  
    root     29258     1  0 16:23 ?        00:00:00 redis-server /etc/redis.conf 

查看被6379 占用的端口情况

[root@Architect redis-1.2.6]# netstat -nltp|grep 6379

 

如果这里启动redis服务失败,一般情况下是因为redis.conf文件有问题,建议检查或找个可用的配置文件进行覆盖,避免少走弯路,这里建议,修改redis.conf,设置redis进程为后台守护进程

    # By default Redis does not run as a daemon. Use 'yes' if you need it.  
    # Note that Redis will write a pid file in /var/run/redis.pid when daemonized.  
    daemonize yes  

4:测试redis

    [root@Architect redis-1.2.6]# redis-cli  
    redis> set name songbin  
    OK  
    redis> get name   
    "songbin"  

5:关闭redis服务
    redis-cli shutdown  

redis服务关闭后,缓存数据会自动dump到硬盘上,硬盘地址为redis.conf中的配置项dbfilename dump.rdb所设定
强制备份数据到磁盘,使用如下命令

    redis-cli save 或者 redis-cli -p 6380 save(指定端口)

6.清除数据

flushdb/flushall

fredis> FLUSHALL

 

redis.conf

timeout设置为0,取消idle客户端

配置文件

/etc/redis.conf 改动的几处:

daemonize yes

timeout 0

logfile /home/jiangguilong/redisdata/redis.log

dbfilename rabbit.rdb

dir /home/jiangguilong/redisdata/

 

 

数据库文件

/home/jiangguilong/redisdata/rabbit.rdb

 日志文件

/home/jiangguilong/redisdata/redis.log

 

在make 2.2.5版本的时候会遇到这样的问题,好像是在2.2.8解决了:

Redis version of redis-2.2.7.tar.gz,my linux System is b2d.. 
error msg: 

root@yes7k:/usr/local# cd redis-2.2.7/ 
root@yes7k:/usr/local/redis-2.2.7# make 
cd src && make all 
make[1]: Entering directory `/usr/local/redis-2.2.7/src' 
cd ../deps/hiredis && make static ARCH="" 
make[2]: Entering directory `/usr/local/redis-2.2.7/deps/hiredis' 
Make18: 在“else”指令之后含有不该出现的文字 
Make27: *** 每个条件只能有一个“else”。 停止。 
make[2]: Leaving directory `/usr/local/redis-2.2.7/deps/hiredis' 
make[1]: *** [dependencies] 错误 2 
make[1]: Leaving directory `/usr/local/redis-2.2.7/src' 
make: *** [all] 错误 2


 


只需要做如下的处理:

vi deps/hiredis/Makefile
Line 18:else ifeq ($(uname_S),Darwin)
modify:elif ifeq ($(uname_S),Darwin)

 

Redis 命令参考

进入 redis-cli

选择某个库 select  1

看有多少个key 

keys *,

返回当前数据库的 key 的数量。

dbsize

flushdb 删除当前库

 

 redis-cli -n 2 flushdb
-n 指定db序号的

 

 

 

flushall 删除所有库

monitor设置监听当前redis服务的所有操作

ping查看是否可以通

 info 可以查看redis使用了多少内存

也记录了redis的版本号

/redis-cli info |grep memory

 

# Memory
used_memory:439304
used_memory_human:429.01K//一般会选择提取出used_memory_human的结果当内存
used_memory_rss:13897728
used_memory_peak:401776
used_memory_peak_human:392.36K
used_memory_lua:20480
mem_fragmentation_ratio:31.64
mem_allocator:jemalloc-3.0.0

 

 

# CPU
used_cpu_sys:0.03
used_cpu_user:0.01
used_cpu_sys_children:0.00
used_cpu_user_children:0.00

 

redis默认最大连接数 10000

redis 127.0.0.1:6379> config get max*
5) "maxclients"
6) "10000"
 

redis-cli  --raw 中文输出

启动时如果输出

 WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

vi /etc/sysctl.conf
添加
net.core.somaxconn = 1024
然后
sysctl -p
生效
再次查看结果
cat /proc/sys/net/core/somaxconn
成功

启动时输出

WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. 
To fix this issue 
run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' 
as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

就按照提示来好了,那么,什么是Transparent Huge Pages(THP)透明大页,

把它关掉。问题在于THP如何转移内存以尝试保持或创建连续页面。一些应用程序可以忍受这一点,而大多数数据库则不能,并且它会导致间歇性的性能问题,有些则很糟糕。无论如何,这并不是Redis独有的。

对于您的应用程序,尤其是JAVA,请设置真实的HugePages并保留透明的种类。如果这样做,请确保为应用程序和Redis正确分配了内存。尽管不得不说,我可能不建议在同一实例/服务器/虚拟机上同时运行应用程序和Redis。

内存是由块管理,即众所周知的页面。超大页面是 2MB 和 1GB 大小的内存块。2MB 使用的页表可管理多 GB 内存,而 1GB 页是 TB 内存的最佳选择。红帽企业版 Linux 6 开始就采用了超大页面管理。

超大页面必须在引导时分配。它们也很难手动管理,且经常需要更改代码以便可以有效使用。因此红帽企业版 Linux 也部署了透明超大页面 (THP)。THP 是一个提取层,可自动创建、管理和使用超大页面的大多数方面。THP可以改进系统的性能。

开关文件

cat /sys/kernel/mm/transparent_hugepage/enabled

使用命令查看时,如果输出结果为[always]表示透明大页启用了。[never]表示透明大页禁用、[madvise]表示(只在MADV_HUGEPAGE标志的VMA中使用THP)

存在问题

THP在有些应用场景会出现异常,因此oracle、mongodb、redis等服务都建议关闭这个特性,因为这个可能导致延迟和内存使用问题。

临时解决方法:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

RHEL/CentOS可以直接写到/etc/rc.local里面实现开始自动修改

总结

Transparent Huge Pages(THP)可以减少使用超大页面的复杂行,目前THP已在各种系统、配置、程序和负载中测试优化,可以改进大多数系统配置的性能。如果不是必要,或者已知存在问题的服务,还是建议开启来。

流子 CSDN认证博客专家 游戏程序员
关注游戏服务器架构及优化,监控预警,智能运维,数据统计分析等,对IO,MOBA,FPS,全球同服方面很感兴趣,希望能和兴趣相投的人一起搞点事。
https://github.com/jiangguilong2000/gamioo
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值