MemCached主主复制和HA 以及 Redis内存数据库

MemCached主主复制和HA 对端服务器: 版本memcached-1.2.8-repcached-2.2.tar.gz

1、一定使用带有复制功能的MemCached(由日本一个工程师)

2、主主复制结构

3、安装带有复制功能的MemCached版本

两台机器:tanzhou112 tanzhou115

(1) 解压 tar -zxvf memcached-1.2.8-repcached-2.2.tar.gz

(2) 安装目录:mkdir /root/training/memcached_replication

(3) ./configure --prefix=/root/training/memcached_replication --with-libevent=/root/training/libevent --enable-replication

编辑:make

出现一个错误:IOV_MAX没有声明

修改源码:memcached.c

55 /* FreeBSD 4.x doesn't have IOV_MAX exposed. */

56 #ifndef IOV_MAX

57 //#if defined(__FreeBSD__) || defined(__APPLE__)

58 # define IOV_MAX 1024

59 //#endif

60 #endif

安装:make install

启用58行

4、启动第一台MemCached(tanzhou112),使用参数-x:指定对端服务器的地址

./memcached -d -u root -m 128 -x 192.168.157.115

错误:

./memcached: error while loading shared libraries: libevent-2.0.so.5:

cannot open shared object file: No such file or directory

确定:ldd查看依赖的库

[root@tanzhou112 bin]# ldd memcached

linux-vdso.so.1 => (0x00007ffd38bfd000)

libevent-2.0.so.5 => not found

libc.so.6 => /lib64/libc.so.6 (0x00007f84a0eec000)

/lib64/ld-linux-x86-64.so.2 (0x0000557c828c5000)

解决办法:建立一个软连接

(64位linux)ln -s /root/training/libevent/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5

(32位linux)ln -s /root/training/libevent/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.5

启动第二台MemCached(tanzhou115),使用参数-x:指定对端服务器的地址

./memcached -d -u root -m 128 -x 192.168.157.112

管道符合 |grep 查看

 

 

 

 

三、Redis内存数据库

1、Redis的前身:MemCached缓存

2、MemCached和Redis的最大区别:MemCached不支持持久化

Redis支持两种持久化的方式:(1)RDB快照 (2)AOF日志

3、Redis的特点:

(*)基于内存

(*)两种持久化的方式:(1)RDB快照 (2)AOF日志

(*)支持消息机制,支持String,只支持Topic(主题、广播)的消息类型

(*)丰富的数据类型

(*)Redis支持简单的事务:本质是把一组操作放入队列执行

问题:Oracle数据库中,事务本质是什么?

(*)Redis支持主从复制

(*)Redis支持HA(哨兵机制)

四、Redis的安装和配置

1、官方的文档:Redis

2、解压:tar -zxvf redis-3.0.5.tar.gz

直接编辑和安装:

make

make PREFIX=/root/training/redis install

3、Redis提供的命令

redis-benchmark Redis提供的一个压力测试工具

redis-check-aof Redis提供的检查AOF日志的工具

redis-check-dump Redis提供的检查RDB文件的工具

redis-sentinel Redis的哨兵,实现Redis HA(Redis版本必须 >= 2.4)

redis-server 服务器端

 

4、核心配置文件:从源码包中拷贝一个

cp ~/tools/redis-3.0.5/redis.conf conf/

 

42 daemonize no Redis是否以后台方式启动,改成yes

50 port 6379 端口

5、启动:bin/redis-server conf/redis.conf

bin/redis-cli

ps -ef | grep redis

默认连接到当前主机的6379端口的redis 服务器上

 

五、Redis的操作:基于key-value形式

1、命令行

(*)键值操作:key 参考讲义NoSQL.pdf:P13

 

hmset

 

(*)数据类型:具体操作:参考讲义:P13

(1)字符串

(2)链表

(3)hash

(4)Set:无序集合

(5)Set:有序集合

(*)Redis的数据类型的应用案例:-----> Redis适用场景:(1)内存保持数据 (2)数据:要么是1,要么是0

问题:如何保持一个网站用户登录信息?

 

或运算 可得知某一天网站的活跃用户数

import org.junit.Test;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPoolConfig;

public class TestRedis {

@Test

public void testRedis(){

JedisPoolConfig conf = null;

conf.setMaxIdle(maxIdle);//最大空闲连接数

conf.setMinIdle(minIdle);//最小空闲连接数

//创建一个Redis 客户端

Jedis jedis = new Jedis("192.168.157.112", 6379);

//插入数据

jedis.set("key1", "HelloWorld");

System.out.println(jedis.get("key1"));

//关闭

jedis.disconnect();

}

}

2、Java API

(*)基本API操作

(*)问题:Redis是否提供连接池? 参考讲义:P15

关于连接池:

conf.setMaxIdle(maxIdle);//最大空闲连接数

conf.setMinIdle(minIdle);//最小空闲连接数

conf.setMaxActive(); //最大数

conf.setMinActive(); //最小数

原则:一般来讲,把最大值和最小设置成一样

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;

import redis.clients.jedis.JedisPoolConfig;


public final class RedisUtil {

//Redis服务器IP

private static String ADDR = "39.108.176.xx";

//Redis的端口号

private static int PORT = 6379;


//访问密码

private static String AUTH = "";



//可用连接实例的最大数目,默认值为8;

//如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。

private static int MAX_ACTIVE = 1024;

//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。

private static int MAX_IDLE = 200;

//等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;

private static int MAX_WAIT = 10000;

private static int TIMEOUT = 10000;

//在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;

private static boolean TEST_ON_BORROW = true;

private static JedisPool jedisPool = null;

/**

* 初始化Redis连接池

*/

static {

try {

JedisPoolConfig config = new JedisPoolConfig();

config.setMaxTotal(MAX_ACTIVE);

// config.setMaxActive(MAX_ACTIVE);

config.setMaxIdle(MAX_IDLE);

config.setMaxWaitMillis(MAX_WAIT);

// config.setMaxWait(MAX_WAIT);

config.setTestOnBorrow(TEST_ON_BORROW);

jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH);

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 获取Jedis实例

* @return

*/

public synchronized static Jedis getJedis() {

try {

if (jedisPool != null) {

Jedis resource = jedisPool.getResource();

return resource;

} else {

return null;

}

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

六、Redis的事务

1、复习:Oracle数据库为例---> 事务

问题:(1)事务的起始标志是什么?

事务中第一条DML语句,Oracle是属于自动开启事务;MySQL是手动开启事务

(2)事务的结束标志是什么?

提交:(*)显式提交:commit

(*)隐式提交:正常退出exit,DDL,DCL

回滚:(*)显式回滚:rollback

(*)隐式回滚:非正常退出、宕机

(3)事务提交后,可以撤销吗?

可以,通过闪回事务查询

(4)事务的本质是什么?(难)

什么叫提交事务?

将DML操作日志成功写入日志文件

2、Redis中的事务:不是真正的事务,本质是:把一组操作放入一个队列中,一起执行。

3、对比Oracle和Redis中的事务

Oracle Redis

事务的开启方式: 自动开启 multi

操作: DML Redis命令

提交事务: commit exec ---> 把一组操作放入一个队列中,一起执行

回滚事务: rollback discard

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值