nosql特点:
1. 多数据源,多样的灵活性处理
memcached和redis的主要区别
1. memcached一般不进行持久化
2. memcached只支持字符串类型
3. memcached(多线程+锁)redis(单线程+多路IO复用)
BASE: 为了解决关系型数据库强一致性引起的问题而引起的可用性降低而提出的解决方案
基本可用(basically available)
软状态(soft state)
最终一致性(eventually consistent)
通过放松对某一时刻数据一致性的要求来换取系统整体伸缩性和性能上的改观。
由于大型系统往往由于地域分布和极高性能的要求,不可能采用分布式事务来
完成这些指标,要想获得这些指标,我们必须采用另外一种方式完成。
这里BASE就是解决这个问题的办法。
5种类型
list: 有序列表(记录存入的顺序,并非排序)
redis事务的本质:
组队多个命令依次防止别的命令插队
事务的有关指令:
multi 从multi命令开始,输入的命令都会依次进入命令队列中,但是不会执行
exec 输入exec后,redis会将之前的命令队列中的命令依次执行
discard 组队过程中可以通过该指令放弃组队
watch key1 key2... 在执行multi之前,先执行watch指令监视若干个key,如果事务执行前
这些key已经被其他命令改动,那么事务中的所有命令将全部取消。
unwatch 取消watch命令对所有key的监视,只对执行该命令的连接有效。
事务的错误处理:
如果组队阶段中某个命令出现了报告错误, 执行时整个队列都会被取消。
如果执行阶段中某个命令报出了执行错误,只有报错的命令不会被执行,其他的都执行。
事务的三特性:
单独的隔离操作:
事务中的所有命令都会序列化,按顺序地执行。事务在执行过程中,不会被其他客户端发送
过来的命令请求所打断
没有隔离级别的概念:
组队中的命令没有提交之前都不会实际被执行,因为事务提交之前任何指令都不会被实际执行
也就不存在“事务内的查询要看到事务内的更新,事务外的查询不能看到”的问题
不保证原子性:
redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。
持久化策略:
rdb:
满足保存策略(配置文件中的 save <seconds> <changes>
正常关闭(shutdown命令:不管有没有改变数据)后保存
手动保存(save: 只管保存,其他不管,读写全部阻塞、bgsave:后台保存,非阻塞)
config命令设置的数据在redis服务器重启后失效(config set requirepass 123, 重启redis后不需要密码)
命令:
select <index> 切换至某个库(默认是0库)
keys * 查出所有key
exists <key> 是否存在某个key
type <key> 查看key的类型
del <key> 删除某个key
expire <key> <second> 为key设置过期时间
ttl 查看有效时间(-1:永不失效;-2:已失效)
dbsize 查看当前数据库的key数量
flushdb 清空当前库
flushall 清空所有库
get <key>
set <key>
append <key>
strlen <key>
setnx <key>
incr <key>
decr <key>
incrby <key> <step>
decrby <key> <step>
mset <key1> <value1> ...
mget <key1> <value1> ...
msetnx <key1> <value1> ... 当所有key都不存在的时候执行
getrange <key> <start> <end> 包含start和end的下标索引对应值
setrange <key> <start> <value>
setex <key> <expire> <value> 设置值的同时设置有效时间
getset 已新换旧,同时返回旧值
lpush <key> <value1> <value2> ...
rpush <key> <value1> <value2> ...
lpop <key> value在key在,value光key亡
rpop <key> value在key在,value光key亡
rpoplpush
lindex <key> <index>
llen <key>
linsert <key> before|after <value> <newvalue>
lrem <key> <n> <value> 删除n个value(n > 0则从左往右删, n < 0则相反,n = 0时删除所有)
lset
sadd <set> <value1> <value2> ... 往set中添加元素
smembers <set> 返回set的所有元素
sismember <set> <value> 判断value是否为set的元素
scard <set> 返回集合元素的个数
srem <set> <value1> <value2> ... 删除集合中的某些元素
spop <set> [count] 从set中随机pop出count个元素
srandmember <set> [count] 从set中随机读取出count个元素
sinter <set1> <set2> ... 交集
sunion <set1> <set2> ... 并集
sdiff <set1> <set2> 差集(set1有但set2没有的元素)
hset <hash> <key> <value>
hsetnx <hash> <key> <value>
hmset <hash> <key1> <value1> <key2> <value2> ...
hexists <hash> <key>
hkeys 列出所有key
hvals 列出所有value
hgetall 列出所有key和value
hincrby <hash> <key> <increment> 为hash中的key所对应的value加上increment
zadd <zset> <score1> <value1> <score2> <value2> ...
zrange <zset> <start> <end>
zrange <zset> <start> <end>
zrangebyscore <zset> <min> <max> [withscores] [limit offset count]
zrevrangebyscore <zset> <min> <max> [withscores] [limit offset count]
zincrby <zset> <increment> <value> 为zset中的value元素的score的score添加increment
zrem <zset> <value>
主从复制:配从不配主(设置appendonly no)
info replication (查看主从复制信息)
方法1: 从服务器执行: slaveof <主服务器ip> <主服务器port>
方法2: 在配置文件中设置replicaof 和masterauth(如果主服务器需要验证)
断开主从关系命令:slaveof no one
注意主服务器的bind参数,设置为127.0.0.1或localhost(如果可以)时,别的机器连不进来
复制原理:
每次从服务器联通后,都会给主机发送sync指令
主机立刻进行存盘操作,发送RDB文件,给从机
从机收到RDB文件后,进去全盘加载
之后每次主机的改变数据的操作,都会立刻发送给从机,从机执行相同的命令
如果主服务器down,则从服务器原地待命(此时从服务器可以断开主从关系,自己充当主服务器)
主服务器关闭redis后,把RDB文件删除后,然后重启redis,从机也会同样清空。
主服务器已在运行redis,从服务器中途加进来,从服务器会同步主服务器已有的数据(主从数据一致)
网友评论