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