内存数据库专题-4

倾然丶 夕夏残阳落幕 提交于 2020-02-14 06:11:05

------------内存数据库专题---------------

为什么要把数据存入内存?


常见的内存数据库:

MemCached:看成Redis前身,严格来说,MemCached不能叫数据库,只能叫缓存
不支持持久化。如果内存停电,数据丢失。

Redis:内存数据库,支持持久化,支持HA

Oracle TimesTen

session一致性

MemCached + keepalive实现

一、Memcached

1、基本原理和体系架构
(*)在内存中,维护了一张巨大的Hash表
(*)通过路由算法来决定数据存储的位置。---> 客户端路由

2、安装配置MemCached

前提:
(1)gcc编译器

(2)libevent库
776 tar -zxvf libevent-2.0.21-stable.tar.gz
777 cd libevent-2.0.21-stable
779 ./configure --prefix=/usr/local/libevent
780 make
781 make install

787 tar -zxvf memcached-1.4.25.tar.gz
788 cd memcached-1.4.25

791 ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
792 make
793 make install
796 cd bin/
798 ./memcached -u root -d -m 128 -p 11211
799 ./memcached -u root -d -m 128 -p 11212
800 ./memcached -u root -d -m 128 -p 11213
801 ps -ef | grep memcached

3、操作MemCached
(*)命令行
telnet 192.168.109.133 11211

保存数据:
set 如果key存在,替换原来的值
add 如果key存在,返回错误

set key1 0 0 4
key名字 标识位 数据过期时间0表示不过期 value的长度
abcd

get key1

统计命令
stats items
stats

4、MemCached路由算法

二、Redis

1、Redis简介
(1)Redis的前身:Memcached
(2)和Memcached区别“
(*)支持持久化:RDB快照、AOF日志
(*)支持丰富的数据类型


2、安装Redis

833 tar -zxvf redis-3.0.5.tar.gz
839 cd redis-3.0.5/
841 make
842 make PREFIX=/usr/local/redis install

redis-benchmark Redis提供的压力测试工具。模拟产生客户端的压力
redis-check-aof 检查aof日志文件
redis-check-dump 检查rdb文件
redis-cli Redis客户端脚本
redis-sentinel 哨兵
redis-server Redis服务器脚本

核心配置文件:redis.conf

42 daemonize yes
50 port 6379

启动redis ./bin/redis-server conf/redis.conf

3、操作Redis
(1)命令行
redis-cli
./bin/redis-cli

127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> keys *
1) "key1"

对数据的操作:
127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> incr money
(integer) 101
127.0.0.1:6379> get money
"101"
127.0.0.1:6379> incrby money 1000
(integer) 1101

(2)Java Api

4、Redis的事务:不是真正的事务,是一种模拟

(1)复习:事务(关系型数据库)

(*)什么是事务?
事务有一组DML语句组成。DML 插入更新删除操作

(*)事务的特点
要么都成功,要么都失败

(*)Oracle中事务的本质:将事务的DML操作写入日志。日志写入成功,则事务执行成功。

(2)Redis事务的本质:将一组操作放入队列中,一次执行(批处理)。

(3)对比Oracle和Redis事务的区别


Oracle Redis
开启事务: 自动开启 命令:multi
执行语句: DML Redis命令
提交事务: 显式提交:commit 隐式提交:DDL语句(create table) 命令:exec 执行放在multi里面的操作
回滚事务: 显式回滚:rollback 隐式回滚:系统掉电,客户端退出 命令:discard命令 把队列中的操作废弃掉

注意:不是真正的事务,只是一种模拟。

(4)举例:模拟银行转账

set tom 1000
set mike 1000
tom --> mike 转账操作必须在事务中,要么都成功,要么都不成功
multi
decrby tom 100
incrby mike 100
exec

127.0.0.1:6379> set tom 1000
OK
127.0.0.1:6379> set mike 1000
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby tom 100
QUEUED
127.0.0.1:6379> incrby mike 100
QUEUED
127.0.0.1:6379> exec
1) (integer) 900
2) (integer) 1100

(5)举例:买票
set tom 1000
set ticket 1
multi
decrby tom 500
decr ticket
exec

在exec前,从另一个窗口,decr ticket

127.0.0.1:6379> set tom 1000
OK
127.0.0.1:6379> set ticket 1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby tom 500
QUEUED
127.0.0.1:6379> decr ticket
QUEUED
127.0.0.1:6379> exec
1) (integer) 500
2) (integer) -1

5、Redis锁机制:执行事务操作的时候,如果监视的值发生了变化,则提交失败。
命令:watch

举例:买票
set tom 1000
set ticket 1
watch ticket -----> 相当于给ticket加了锁。认为在下面执行事务的时候,值不会变。
multi
decrby tom 500
decr ticket
exec

127.0.0.1:6379> set tom 1000
OK
127.0.0.1:6379> set ticket 1
OK
127.0.0.1:6379> watch ticket
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby tom 500
QUEUED
127.0.0.1:6379> decr ticket
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get tom
"1000"

nil 代表操作没有执行或者执行失败。

6、Redis的消息机制:消息系统

(1)消息的类型
(*)Queue消息:队列,点对点。
(*)Topic消息:主题,群发:发布消息,订阅消息

(2)Redis消息机制:
只支持Topic消息。

命令:发布消息 publish
订阅:subscribe
psubscribe 订阅消息 可以用通配符来订阅消息

(3)常用的消息系统:
Redis 只支持 Topic
Kacka 只支持Topic 需要Zookeeper支持。
JMS Java Messging Service java消息服务标准。支持Queue Topic
产品:Weblogic

7、Redis持久化
本质:备份和恢复

(1)RDB快照:默认

(*)看成一种快照,备份。每隔段时间,将内存汇总的数据保存到硬盘上。产生RDB文件。

(*)RDB 生成策略:

147 save 900 1 900秒内,有1个key发生变化
148 save 300 10 300内,如果有10个key发生变化,执行RDB
149 save 60 10000 60秒内,如果有10000个key发生变化,执行RDB

save 时间 发生变化的key的个数

(*)其他参数
164 stop-writes-on-bgsave-error yes 当后台写进程出错时,禁止写入新的数据

170 rdbcompression yes 是否压缩。如果看重性能,设置成no
压缩会节省空间,但会影响备份和恢复性能

182 dbfilename dump.rdb
192 dir ./

(*)RDB的优点和缺点
优点:快 恢复速度快
缺点:在两次RDB之间,可能会造成数据的丢失。
解决:AOF


(2)AOF日志
客户端在操作Redis时,把操作记录到文件中,如果发生崩溃,读取日志,把操作完全执行一遍。

(*)默认是禁用。
509 appendonly no 参数修改成yes

(*)AOF记录策略
538 # appendfsync always 每个操作都记录日志:优点安全 缺点:慢
539 appendfsync everysec
540 # appendfsync no 由操作系统来决定记录日志的方式。不会用的到。

(*)AOF日志重写:overwrite
举例:
set money 0
incr money
..100次

set money 100

./redis-benchmark -n 100000
模拟客户端100000次请求

(*)参数设置
561 no-appendfsync-on-rewrite no 执行重写的时候,不写入新的日志
581 auto-aof-rewrite-min-size 64mb 执行重写的文件大小。到64M触发重写。


(3)当两个同时存在时,优先执行哪个?
504 # If the AOF is enabled on startup Redis will load the AOF, that is the file
505 # with the better durability guarantees.

AOF开启时,优先使用AOF

8、Redis的主从复制

1、Redis主从复制集群:

作用:
主从复制,主从备份,防止主节点down机
任务分离:分摊主节点压力。读写分离。

Memcacached 主主复制
Redis 主从复制

Redis集群两种部署方式
星型模型:
优点:效率高,两个slave地位一样,可以直接从主节点取出信息
缺点:HA比较麻烦

线性模型:
优点:HA简单
缺点:效率不如星型模型

cp redis.conf redis6379.conf
cp redis.conf redis6380.conf
cp redis.conf redis6381.conf

主节点:关闭rdb aof
509 appendonly no
147 #save 900 1
148 #save 300 10
149 #save 60 10000

从节点
改端口号
50 port 6380
改aof rdb文件名:
182 dbfilename dump6380.rdb
513 appendfilename "appendonly6380.aof"
211 slaveof 192.168.109.133 6379

root@node3 redis]# ./bin/redis-server ./conf/redis6379.conf
[root@node3 redis]# ./bin/redis-server ./conf/redis6380.conf
[root@node3 redis]# ./bin/redis-server ./conf/redis6381.conf

[root@node3 redis]# ps -ef | grep redis
root 4830 1 1 22:56 ? 00:00:00 ./bin/redis-server *:6379
root 4834 1 2 22:56 ? 00:00:00 ./bin/redis-server *:6380
root 4840 1 2 22:56 ? 00:00:00 ./bin/redis-server *:6381
root 4846 1378 0 22:56 pts/1 00:00:00 grep redis
[root@node3 redis]# ./bin/redis-cli -p 6379
127.0.0.1:6379> set tom 10000
OK
127.0.0.1:6379> quit
[root@node3 redis]# ./bin/redis-cli -p 6380
127.0.0.1:6380> get tom
"10000"

默认情况下,从节点只读。

注意:一次性启动从节点不要太多。


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!