redis做游戏redis缓存服务器架构的缓存效率低怎么解决

记录搭建redis用作缓存并且成功运行了一个简单例子的经历-爱编程
记录搭建redis用作缓存并且成功运行了一个简单例子的经历
环境:CentOS7,redis版本:redis-3.2.8
Redis 下载:&
1. 解压安装包
2. 编译(到解压的redis目录下执行make命令),编译过程中发下了有各种各样的警告,但是我没有管,依然编译完成后再进行了一次make
3. 启动服务:进入redis 的 src目录下执行:(命令规则:./redis-server + 空 + 自定义配置 + 空 + &)
./redis-server ../redis.conf &
出现 Redis 的Logo就表示启动服务成功了
由于我觉得用作于持久数据库不太喜欢,只想把 Redis 用作于缓存使用,取代memcached
先 kill 服务进程,修改配置(redis/redis.conf)
4. 屏蔽 bind IP (因为我想直接在局域网任何人都可以链接,所以屏蔽,免得导致 jedis 链接时出毛病)
#bind 127.0.0.1
5. 找到&requirepass 取消屏蔽,后面的修改为自己想要的密码如:requirepass abcd666
requirepass abcd666
6. 找到Redis自动持久的规则,屏蔽掉
(分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。)
7. 找到&maxmemory 启用,以及下面的&maxmemory-policy 回收策略
maxmemory 100mb #表示最大占用多少内存
maxmemory-policy allkeys-lru #使用什么回收策略
当 maxmemory 限制达到的时候 Redis 会使用的行为由 Redis 的 maxmemory-policy 配置指令来进行配置:
noeviction:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)
allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
allkeys-random: 回收随机的键使得新添加的数据有空间存放。
volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。
使用指定配置方式启动服务:
./redis-server ../redis.conf &
使用客户端尝试:
./redis-cli -h 192.168.1.168 -p 10086 -a abcd666 #这是比较明确的登录方式,
./redis-cli -a abcd666 #也可以这样简洁登录
如果配置了密码且登录的时候不输入密码也可以登录,但在查询时就会提示:
网上搜了搜好像用得多的就是 Jedis,由于只是想弄一个简单的例子所以没有使用Maven来建项目
我喜欢在Maven仓库去下载jar:
下面是一个简单的例子,需要了解更多可以自行Google或到官网API
import java.util.HashM
import java.util.I
import java.util.L
import java.util.M
import redis.clients.jedis.J
public class TestRedis {
public TestRedis() {
//连接redis服务器
jedis = new Jedis("192.168.1.168", 6379);
//权限认证
jedis.auth("abcd666");
public static void main(String[] args) {
TestRedis t = new TestRedis();
t.testString();
* redis存储字符串
public void testString() {
jedis.set("name","zhangsan");
System.out.println(jedis.get("name"));
jedis.append("name", " is 张三"); //拼接
System.out.println(jedis.get("name"));
jedis.del("name");
//删除某个键
System.out.println(jedis.get("name"));
//设置多个键值对
jedis.mset("name","莉莉安","age","18","sex","女");
jedis.incr("age"); //进行加1操作
jedis.expire("name", 10000);//设置过期时间
System.out.println(jedis.get("name") + "-" + jedis.get("age") + "-" + jedis.get("sex"));
System.out.println("---& "+jedis.dbSize());//键值对有多少个了
到这里就完毕了,可以跑出个结果:
版权所有 爱编程 (C) Copyright 2012. . All Rights Reserved.
闽ICP备号-3
微信扫一扫关注爱编程,每天为您推送一篇经典技术文章。Redis 常见的性能问题和解决方法 - 温柔一刀 - ITeye技术网站
博客分类:
1.Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。
2.Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。
3.Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。
下面是我的一个实际项目的情况,大概情况是这样的:一个Master,4个Slave,没有Sharding机制,仅是读写分离,Master负责写入操作和AOF日志备份,AOF文件大概5G,Slave负责读操作,当Master调用BGREWRITEAOF时,Master和Slave负载会突然陡增,Master的写入请求基本上都不响应了,持续了大概5分钟,Slave的读请求过也半无法及时响应,Master和Slave的服务器负载图如下:
Master Server load:
Slave server load:
上面的情况本来不会也不应该发生的,是因为以前Master的这个机器是Slave,在上面有一个shell定时任务在每天的上午10点调用BGREWRITEAOF重写AOF文件,后来由于Master机器down了,就把备份的这个Slave切成Master了,但是这个定时任务忘记删除了,就导致了上面悲剧情况的发生,原因还是找了几天才找到的。
将no-appendfsync-on-rewrite的配置设为yes可以缓解这个问题,设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入。最好是不开启Master的AOF备份功能。
4.Redis主从复制的性能问题,第一次Slave向Master同步的实现是:Slave向Master发出同步请求,Master先dump出rdb文件,然后将rdb文件全量传输给slave,然后Master把缓存的命令转发给Slave,初次同步完成。第二次以及以后的同步实现是:Master将变量的快照直接实时依次发送给各个Slave。不管什么原因导致Slave和Master断开重连都会重复以上过程。Redis的主从复制是建立在内存快照的持久化基础上,只要有Slave就一定会有内存快照发生。虽然Redis宣称主从复制无阻塞,但由于磁盘io的限制,如果Master快照文件比较大,那么dump会耗费比较长的时间,这个过程中Master可能无法响应请求,也就是说服务会中断,对于关键服务,这个后果也是很可怕的。
以上1.2.3.4根本问题的原因都离不开系统io瓶颈问题,也就是硬盘读写速度不够快,主进程 fsync()/write() 操作被阻塞。
5.单点故障问题,由于目前Redis的主从复制还不够成熟,所以存在明显的单点故障问题,这个目前只能自己做方案解决,如:主动复制,Proxy实现Slave对Master的替换等,这个也是Redis作者目前比较优先的任务之一,作者的解决方案思路简单优雅,详情可见 Redis Sentinel design draft 。
1.Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化。
2.如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。
3.为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内。
4.尽量避免在压力较大的主库上增加从库
5.为了Master的稳定性,主从复制不要用图状结构,用单向链表结构更稳定,即主从关系为:Master&--Slave1&--Slave2&--Slave3.......,这样的结构也方便解决单点故障问题,实现Slave对Master的替换,也即,如果Master挂了,可以立马启用Slave1做Master,其他不变。
今天暂时写这么多吧,以后再补充。
浏览 24254
论坛回复 /
(16 / 10917)
最近也在研究redis,如何在项目中使用呢?感觉网上的资料太少了。。。网上资料已经很多了,这里是中文资料聚集地:/html/3537.html
浏览: 723238 次
来自: 上海
必须用ie浏览器
我也出现与楼上相同的问题。查了一些资料,描述的跟楼主的博文差不 ...
djlijian 写道最近也在研究redis,如何在项目中使用 ...
最近也在研究redis,如何在项目中使用呢?感觉网上的资料太少 ...
lz好人呀,谢谢分享!redis(二)redis+TCMALLOC高性能的缓存服务器的安装配置 - 成长源于沉淀 - ITeye技术网站
博客分类:
安装
1准备编译环境
& yum -y install gcc gcc+ gcc-c++ openssl openssl-devel pcre pcre-devel
2 下载源码包(由于google不能上所以选择从本地上传)
wget 172.60.0.172:8080/libunwind-1.1.tar.gz
wget 172.60.0.172:8080/gperftools-2.1.tar.gz
wget 172.60.0.172:8080/redis-2.8.10.tar.gz
3 编译安装
tar xf& libunwind-1.1.tar.gz
CFLAGS=-fPIC ./configure
make CFLAGS=-fPIC
make CFLAGS=-fPIC install
gperftools的安装主要是用到了TCMALLOC来提高性能所以最简化安装
tar xf gperftools-2.1.tar.gz
cd gperftools-2.1
./configure& --disable-cpu-profiler --disable-heap-profiler --disable-heap-checker
--disable-debugalloc --enable-minimal
make && make install
echo "/usr/local/lib" & /etc/ld.so.conf.d/usr_local_lib.conf
/sbin/ldconfig
cd /usr/local/lib
ln -sv libtcmalloc_minimal.so.4.1.2 libtcmalloc.so
redis的安装
tar xf redis-2.8.10.tar.gz
cd redis2.8.10
mkdir –p /opt/redis
make PREFIX=/opt/redis USE_TCMALLOC=yes FORCE_LIBC_MALLOC=yes install
三 配置
创建配置文件夹以及文件
mkdir -p /opt/redis/etc
mkdir -p /opt/redis/run
mkdir -p /opt/redis/data/6379
mkdir -p /opt/redis/log
cp /redis的解压路径 /redis.conf /opt/redis/etc/redis.conf
cp /opt/redis/etc/redis.conf /opt/redis/etc/redis_6379.conf
修改配置文件:
vim /opt/redis/etc/redis_6379.conf
daemonize yes
pidfile /opt/redis/run/redis_6379.pid
dir /opt/redis/data/6379
logfile /opt/redis/log/redis_6379.log
创建服务管理脚本
vim /etc/init.d/redis
#!/bin/sh
PATH="/opt/redis/bin:$PATH"
EXEC="/opt/redis/bin/redis-server"
CLIEXEC="/opt/redis/bin/redis-cli"
PIDFILE="/opt/redis/run/redis_6379.pid"
CONF="/opt/redis/etc/redis_6379.conf"
REDISPORT="6379"
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 "Usage: $0 {start|stop}" &&2
&&&&&&& exit 1
&&&&&&& ;;
esac
授权 chmod +x /etc/init.d/redis
vim /etc/sysctl.conf
在最后添加以下节点:
vm.overcommit_memory = 1
sysctl –p
启动redis
/etc/init.d/redis start
验证
ps aux | grep redis
浏览: 75473 次
来自: 上海
为什么我启动的时候,能启动, 但报如下错误呢?[2016-12 ...
这篇文章为了凸显fst得效率也是醉了.其一:kryo不做任何优 ...
写道aiyoaiyo0330 写道请教个问 ...
能详细讲讲吗?
大神,求解,CachePool 为什么要用单例?Linux--不是那么难,学习Linux--那么难是不?Legion是一个个人的linux学习记录型博客,本人不望博客多出名,只期待自己能把自己在linux路上的点点滴滴都做个记录。只期望自己能很好的坚持写下去。

我要回帖

更多关于 redis缓存服务器 的文章

 

随机推荐