Redis学习笔记(REmote DIctionary Server远程字典服务器)

在分布式数据库中CAP原理CAP+BASE:C:Consistency:强一致性,A:Availability:可用性,P:Partition tolerance:分区容错性。
CAP理论的核心是:**一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,
最多只能同时较好的满足两个。**
因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:
CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。(msyql/oracle);
CP - 满足一致性,分区容忍必的系统,通常性能不是特别高。(redis/mongdb);
AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。(大多数网站架构选择淘宝,京东);

BASE就是为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案。

BASE其实是下面三个术语的缩写:
基本可用(Basically Available)
软状态(Soft state)
最终一致(Eventually consistent)

它的思想是通过让系统放松对某一时刻数据一致性的要求来换取系统整体伸缩性和性能上改观。为什么这么说呢,缘由就在于大型系统往往由于地域分布和极高性能的要求,不可能采用分布式事务来完成这些指标,要想获得这些指标,我们必须采用另外一种方式来完成,这里BASE就是解决这个问题的办法。

redis.conf中我们可以通过
Set the number of databases. The default database is DB 0, you can select a different one on a per-connection basis using SELECT where dbid is a number between 0 and ‘databases’-1
databases 16
可知,redis有16个簇。索引(index)从0开始,到15.
redis命令:
KEYS * 查看当前库中所有的key,SELECT index查找到簇

//查询redis下标为0也就是第一个库中所有的key;
127.0.0.1:6379> keys *
//select 1查询redis下标为1也就是第二个库;
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> 

FLUSHALL 清空16个库中所有的key,FLUSHDB只清空当前库中的key

清除库中的keyFLUSHALL会清除16个库中的所有key
127.0.0.1:6379> FLUSHALL
FLUSHDB会清除当前所在的库。
127.0.0.1:6379> FLUSHDB

EXISTS key 查看key是否存在

通过KEYS *可知目前库中存有k1和k2; exists k1是用来判断key k1是否存在,存在为1,不存在为0127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> KEYS *
1) "k1"
2) "k2"
127.0.0.1:6379> exists k1
(integer) 1
127.0.0.1:6379> EXISTS k3
(integer) 0

MOVE key index剪切key到另一个库中

MOVE k2 2 表示把k2剪切到2号库中。
127.0.0.1:6379> MOVE k2 2
(integer) 1
127.0.0.1:6379> SELECT 2
OK
127.0.0.1:6379[2]> KEYS *
1) "k2"
127.0.0.1:6379[2]> SELECT 0
OK
127.0.0.1:6379> KEYS *
1) "k1"

ttl key 检查key还有多少秒过期, -1表示永不过期,-2表示已过期
EXPIRE key second 设置key还有多少秒过期,过期后该key会被清空
SETEX key seconds value
将值 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位)。如果 key 已经存在, SETEX 命令将覆写旧值。
**这个命令类似于
**SET key value
EXPIRE key seconds # 设置生存时间**
两者不同之处是, SETEX 是一个原子性(atomic)操作,关联值和设置生存时间两个动作会在同一时间内完成,该命令在 Redis 用作缓存时,非常实用。

127.0.0.1:6379> ttl k1
(integer) -1
127.0.0.1:6379> EXPIRE k1 10
(integer) 1
127.0.0.1:6379> ttl k1
(integer) 4
127.0.0.1:6379> ttl k1
(integer) 1
127.0.0.1:6379> ttl k1
(integer) 0
127.0.0.1:6379> ttl k1
(integer) -2
127.0.0.1:6379> get k1
(nil)

#设置k5 值为"10sLifeCycle"生命周期是10s。
127.0.0.1:6379> SETEX k5 10 "10sLifeCycle"
OK
127.0.0.1:6379> get k5
"10sLifeCycle"
127.0.0.1:6379> ttl 廫5
(integer) -2
127.0.0.1:6379> ttl k5
(integer) -2
127.0.0.1:6379> SETEX k5 10 "10sLifeCycle"
OK
127.0.0.1:6379> ttl k5
(integer) 8
127.0.0.1:6379> get k5
"10sLifeCycle"
127.0.0.1:6379> ttl k5
(integer) 1
127.0.0.1:6379> get k5
(nil)
127.0.0.1:6379> ttl k5
(integer) -2
127.0.0.1:6379> 

SETNX key value

将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。

127.0.0.1:6379> get k6
(nil)
127.0.0.1:6379> SETNX k6 notexist
(integer) 1
127.0.0.1:6379> get k6
"notexist"
127.0.0.1:6379> SETNX k6 alreadyexist
(integer) 0
127.0.0.1:6379> get k6
"notexist"

MSET key value [key value …]
同时设置一个或多个 key-value 对。
如果某个给定 key 已经存在,那么 MSET 会用新值覆盖原来的旧值,如果这不是你所希望的效果,请考虑使用 MSETNX 命令:它只会在所有给定 key 都不存在的情况下进行设置操作。

MSET 是一个原子性(atomic)操作,所有给定 key 都会在同一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况,不可能发生。

MGET key [key …]
返回所有(一个或多个)给定 key 的值。
如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。因此,该命令永不失败。

MSETNX key value [key value …]
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。即使只有一个给定 key 已存在, MSETNX 也会拒绝执行所有给定 key 的设置操作。
MSETNX 是原子性的,因此它可以用作设置多个不同 key 表示不同字段(field)的唯一性逻辑对象(unique logic object),所有字段要么全被设置,要么全不被设置。

127.0.0.1:6379> GET k1
"helloredis"
127.0.0.1:6379> MSET k1 v1 k2 v2 kk vv
OK
127.0.0.1:6379> MGET k1 k2 kk
1) "v1"
2) "v2"
3) "vv"
127.0.0.1:6379> MGET k1 k2 kk no
1) "v1"
2) "v2"
3) "vv"
4) (nil)

# 对不存在的 key 进行 MSETNX

redis> MSETNX rmdbs "MySQL" nosql "MongoDB" key-value-store "redis"
(integer) 1

redis> MGET rmdbs nosql key-value-store
1) "MySQL"
2) "MongoDB"
3) "redis"

# MSET 的给定 key 当中有已存在的 key
redis> MSETNX rmdbs "Sqlite" language "python"  # rmdbs 键已经存在,操作失败
(integer) 0
redis> EXISTS language                          # 因为 MSET 是原子性操作,language 没有被设置
(integer) 0
redis> GET rmdbs                                # rmdbs 也没有被修改
"MySQL"

你可能感兴趣的:(redis)