Redis(一)CAP+BASE、数据类型和常用关键字

分布式数据库中的CAP原理CAP+BASE

C:Consistency(强一致性)

A:Availability(高可用性)

P:Partion tolerance(分区容错性)

CAP理论图的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个

CAP的理论就是说在分布式存储系统中,最多只能实现上面的两点

而由于在分布式的项目下,不同的服务器之间的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们必须要实现的

所以我们只能在一致性可用性之间进行权衡,没有NoSQL系统能同时保证这一点。

因此,根据CAP原理将NoSQL数据库分成了满足CA原则、满足CP原则和满足AP原则三大类:

CA-单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。例. 传统Oracle数据库

CP-满足一致性,分区容忍性的系统,通常性能不是特别高。例. Redis、Mongodb

AP-满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。例.大多数网站架构的选择

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

BASE其实是下面三个术语的缩写:

基本可用(Basically Available)

软状态(Soft state)

最终一致(Eventually consistent)

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

注意:严谨的来说单机 Redis 属于 cp 模型,Redis-cluster 属于 ap 模型,利用BASE的最终一致性来保证数据的一致性。

Rdis

Redis:REmote DIctionary Server(远程字典服务器)

是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,被称为数据结构数据库。

Redis与其他key-value缓存产品有一下三个特点:

  1. Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
  2. Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
  3. Redis支持数据的备份,即master-slave模式的数据备份。

能干嘛

  1. 内存存储和持久化:redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务。
  2. 取最新N个数据的操作,如:可以将最新的10条评论的ID放在Redis的List集合里面
  3. 模拟类似于HttpSession这种需要设定过期时间的功能。
  4. 发布、订阅消息系统
  5. 定时器、计数器

Redis下载

Linux下Redis安装

  1. 下载获得redis-3.0.4.tar.gz后将它放入我们的Linux目录/root
  2. /opt目录下,解压命令:tar -zxvf redis-3.0.4.tar.gz
  3. 解压完成后出现文件夹:redis-3.0.4
  4. 在redis-3.0.4目录下执行make命令
  5. 如果make完成后继续执行make install
  6. 查看默认安装目录:usr/local/bin
  7. 启动
  8. 永远的helloworld
  9. 关闭

注意:Linux下安装redis报错有可能是gcc版本不兼容,需要升级比如gcc 4.8.5 安装redis6.0以上版本会报错

升级9.0b版本gcc
yum -y install centos-release-scl && yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils && scl enable devtoolset-9 bash

Redis数据库基础

  1. 单进程
  2. 默认16个数据库,类似数组下表从零开始,初始默认使用零号库
  3. Select命令切换数据库
  4. Dbsize查看当前数据库的key的数量
  5. Flushdb:清空当前库
  6. Flushall:通杀全部库
  7. 同一密码管理,16个库都是同样密码,要么都ok要么一个也连不上
  8. Redis索引都是从零开始
  9. 默认端口是6379

Redis的五大数据类型

基础命令

  • keys * 查看当前库的所有key

  • exists key的名字,判断某个key是否存在

  • move key db -->当前库就没有了,被移出了

  • expire key 秒钟:为给定的key设置过期时间

  • ttl key查看还有多少秒过期,-1表示永不过期,-2表示已过期

  • type key 查看你的key是什么类型

String(字符串)

string是redis最基本的类型,可以理解为Memcached一样的类型,一个key对应一个value。

string类型是二进制安全的,意思是redis的string可以包含任何数据。比如ipg图片或者序列化的对象。

string类型是Redis最基本的数据结构,一个redis中字符串value最多可以是512M。

常用关键字:

  • set/get/del/append/strlen 增/查/删/追加/获取字符串长度

    • set k1 v1/get k1/del k1/append k1 123/strlen k1
  • Incr/decr/incrby/decrby 一定要是数字才能进行加减

    • Incr k1/decr k1 +1/-1
    • incrby k1 2/decrby k1 2 +自定义数字/-自定义数字
  • getrange/setrange 设置指定区间范围值

    • getrange k1 0 3 获取0~3位的值
    • setrange k1 0 xxx 从0开始覆盖xxx三位
  • setex(set with expire)键秒值/setnx(set if not exist)

    • setex k1 10 v1 设置10秒后过期
    • setnx k1 v1 判断如果不存在就新增
  • mset/mget 同时操作多条数据

    • mset k1 v1 k2 v2/mget k1 k2
  • msetnx 操作多条数据中有一条存在则失败

    • msetnx k1 v1 k2 v2
  • getset(先get在set) 查看并覆盖

    • getset k1 v11

Hash(哈希,类似java里的Map)

Redis hash是一个键值对集合。

Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

类似java里面的Map

KV模式不变,但V是一个键值对

常用关键字:

  • hset/hget/hmset/hgetall/hdel

    • hset user id 1/hget user id 新增/获取元素

    • hmset user name li age 10/hgetall user id name age 新增/获取多个元素

    • hgetall user 获取所有key和value

    • hdel user name 删除key

  • hlen user获取user中key个数

  • hexists user id 判断user中id是否存在,有是1,无则0

  • hkeys/hvals user 获取user所有key/value

  • hincrby/hincrbyfloat user age 2/0.5 自定义age+2/+0.5,key必须为数字,float结尾的是可以用小数来加

  • hsetnx user age 11 判断user中是否存在age,存在就添加

List(列表)

Redis列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)。

它的底层是一个链表。

它是一个字符链表,left,right都可以插入添加。

如果键不存在,创建新的链表。

如果键已经存在,新增内容。

如果值全移除,对应的键也就消失了。

链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了。

常用关键字:

  • lpush/rpush/lrange

    • lpush/rpush list1 1 2 3 4 5 从左/右开始新增元素,类似入栈/入队列
    • lrange list1 0 -1 从左开始获取全部元素(54321/12345)
  • lpop/rpop list1 左/右取出一个元素

  • lindex list 0 按照索引下表获得元素(从上到下)

  • llen list1 获取集合长度

  • lrem list1 2 3 删2个3

  • ltrim list1 0 3 开始0结束3,截取指定范围的值后再赋值给list1

  • rpoplpush list1 list2 取list1右边一个(最后一个)值,新增入list2左边(第一个)

  • lset list1 1 x 设置list1集合位置1上的值为x

  • linsert list1 before/after 值1 值2 在list1中,把值2插入值1之前/之后

Set(集合)

Redis的Set是string类型的无序集合,无重复值。它是通过HashTable实现的。

常用关键字:

  • sadd/smembers/sismember

    • sadd set1 v1 v2 v3 新增,自动去掉重复值

    • smembers set1 打印元素

    • sismember set1 v1 查看在set1是否有v1值,有为1,没有为0

  • scard set1 获取集合里面的元素个数

  • srem set1 v1 删除set1集合中v1元素

  • srandmember set1 3从set1中随机读取3个数

  • spop set1 随机取出值

  • smove set1 set2 v1 将set1 里的一值赋给set2

  • sdiff/sinter/sunion set1 set2 差集(找出第一个集合中不存在后面任意集合中的元素)/交集/并集

Zset(sorted set:有序集合)

Redis zset和set一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数

redis正是通过分数来为集合中的成员进行从小到大排序。zset的成员是唯一的,但分数(score)却可以重复。

和set的区别:在set基础上加上一个score值,之前set是k1 v1 v2 v3,现在zset是k1 score v1 score v2

常用关键字:

  • zadd zset1 1 v1 2 v2 新增

  • zrange/zrevrange zset1 0 -1 正序/逆序获取全部元素

  • zrangebyscore key 开始score 结束score

    • zrangebyscore zset1 0 -1 withscores 获取zset1的值和score

    • zrangebyscore zset1 0 (3 ( 不包含,获取zset1中score从0~3的值,不包含3

    • zrangebyscore zset1 0 3 limit 1 2 作用是返回限制 limit开始下标1 2步

  • zrem zset1 v1 某score下对应的value值,作用是删除元素

  • zcard/zcount 区间

    • zcard zset1 获取元素个数

    • zcount zset1 0 2 获取score中元素个数

  • zrank/zrevrank zet1 v1 正序/逆序获得v1下标值

  • zscore zet1 v1 获得值对应score

  • zrevrangebyscore key 结束score 开始score 同zrangebyscore ,不过范围值反过来写,逆序输出值

你可能感兴趣的:(Redis,分布式,redis,java)