1. 1. 1. NoSQL
    1. 1.0.1. 1.1 单机Mysql时代
    2. 1.0.2. 1.2 Memcached(缓存) + Mysql + 垂直拆分(读写分离)
    3. 1.0.3. 1.3 分库分表 + 水平拆分 + Mysql集群
    4. 1.0.4. 1.4 如今最近的年代
  • 2. 2. 为什么是NoSQL
  • 3. 3. NoSQL的四大分类
    1. 3.0.1. 3.1 键值(Key-Value)存储数据库
    2. 3.0.2. 3.2 列存储数据库
    3. 3.0.3. 3.3 文档型数据库
    4. 3.0.4. 3.4 图形(Graph)数据库
  • 4. 4. NoSQL应用场景
  • 5. 5. 什么是Redis
  • 6. 6. Redis特点
  • 7. 7. Ridis安装
  • 8. 8. redis常用命令
    1. 8.0.1. 8.1 set get命令,存值,取值
    2. 8.0.2. 8.2 切换数据库,redis默认有16个数据库,默认使用0号数据库,可以通过select切换
    3. 8.0.3. 8.3 清空当前数据库:flushdb,清空所有数据库:flushall
    4. 8.0.4. 8.4 查询所有key: keys*
    5. 8.0.5. 8.5 查询数据库的大小:dbsize
    6. 8.0.6. 8.6 查看key是否存在:exists keyName,存在返回1,否则返回0
    7. 8.0.7. 8.7 移除Key: move keyName 1
    8. 8.0.8. 8.8 为key设置过期时间: expire keyName timeout
    9. 8.0.9. 8.9 查看key的剩余存活时间:ttl keyName
    10. 8.0.10. 8.10 查看key的类型:type keyName
  • 9. 9. String详解
    1. 9.0.1. 9.1 strlen:求value的长度,append:追加
    2. 9.0.2. 9.2 自增,自减操作:incr incrby decr decrby
    3. 9.0.3. 9.3 字符串的范围操作:getrange,setrange
    4. 9.0.4. 9.4 设置过期时间:setex(如果存在Key则覆盖,不存在则创建),setnx(如果不存在就设置)
    5. 9.0.5. 9.5 批量设置和获取值:mset,mget, msetnx(操作为原子性,要么都成功,要么都失败)
    6. 9.0.6. 9.6 存取对象
    7. 9.0.7. 9.7 组合操作:getset先获取再设置,如果不存在就返回nil
  • 10. 10. list详解
    1. 10.0.1. 10.1 左插:lpush,左删:lpop
    2. 10.0.2. 10.2 右插:rpush,右删:rpop
    3. 10.0.3. 10.3 获取列表元素:lrange
    4. 10.0.4. 10.4 通过下标获取元素:lindex
    5. 10.0.5. 10.5 获取列表长度:llen
    6. 10.0.6. 10.6 移除具体的值所在的键值对:lrem 列表 移除几个 移除的具体value
    7. 10.0.7. 10.7 截取操作:ltrim 列表 截取的开始下标 截取的结束下标
    8. 10.0.8. 10.8 rpoplpush:移除列表中的最后一个元素并将这个元素放到一个新的列表中
    9. 10.0.9. 10.9 判断列表是否存在:EXISTS list
    10. 10.0.10. 10.10 lset:更新列表中指定下标的元素的value,前提是该下标必须有值,否则报错
    11. 10.0.11. 10.11 在列表中插入值:前插和后插:linsert
  • 11. 11. set详解
    1. 11.0.1. 11.1 添加:sadd
    2. 11.0.2. 11.2 查看所有: smembers
    3. 11.0.3. 11.3 查询set的元素个数:scard
    4. 11.0.4. 11.4 判断set中是否存在某元素:sismember
    5. 11.0.5. 11.5 移除某个元素:srem
    6. 11.0.6. 11.6 随机抽取一个元素:SRANDMEMBER
    7. 11.0.7. 11.7 随机移除一个元素:spop
    8. 11.0.8. 11.8 将一个集合中的元素移动到另一个集合中:smove
    9. 11.0.9. 11.9 集合之间求交并补集:sinter sunite sdiff
  • 11.1. 差集sdiff
  • 11.2. 交集sinter
  • 11.3. 并集sunion
  • 12. 12. hash详解
    1. 12.0.1. 12.1 向hash中添加值:hset
    2. 12.0.2. 12.2 得到hash中的指定filed的值:hget
    3. 12.0.3. 12.3 得到hash中的所有值:hgetall
    4. 12.0.4. 12.4 批量添加和获取:hmset hmget
    5. 12.0.5. 12.5 删除指定的字段:hdel
    6. 12.0.6. 12.6 获取hash的字段长度:hlen
    7. 12.0.7. 12.7 判断hash中的字段是否存在:hexist
    8. 12.0.8. 12.8 获取所有的key(字段)hkeys,获取所有的value:hvals
    9. 12.0.9. 12.9 指定增量:hincrby
  • 13. 13. Zset详解
    1. 13.0.1. 13.1 添加数据:zadd
    2. 13.0.2. 13.2 获取所有值,按照索引获取:zrange
    3. 13.0.3. 13.3 获取所有值,按照score获取:zrangebyscore
    4. 13.0.4. 13.4 移除元素:zrem
    5. 13.0.5. 13.5 得到元素的个数:zcard
    6. 13.0.6. 13.6 获取指定区间的成员数量:zcount
  • 14. 14. geospatial
  • 15. 15. bitmaps
    1. 15.0.1. 15.1 存储数据:setbit
    2. 15.0.2. 15.2 获取指定下标的值:getbit
    3. 15.0.3. 15.3 统计bitmap中1的位数:bitcount
  • 16. 16. hyperloglogs
    1. 16.0.1. 16.1 添加:pfadd
    2. 16.0.2. 16.2 计数:pfcount
    3. 16.0.3. 16.3 合并:pfmerge
  • rediss-数据类型

    1. NoSQL

    NoSQL(Not Only SQL ),意即不仅仅是SQL, 泛指非关系型的数据库。Nosql这个技术门类,早期就有人提出,发展至2009年趋势越发高涨。

    1.1 单机Mysql时代

    file

    1.2 Memcached(缓存) + Mysql + 垂直拆分(读写分离)

    网站80%的情况都是在读,每次都要去查询数据库的话就十分的麻烦!所以说我们希望减轻数据库的压力,我们可以使用缓存来保证效率! file

    1.3 分库分表 + 水平拆分 + Mysql集群

    file

    1.4 如今最近的年代

    file

    2. 为什么是NoSQL

    NoSQL = Not Only SQL(不仅仅是SQL)

    Not Only Structured Query Language

    关系型数据库:列+行,同一个表下数据的结构是一样的。

    非关系型数据库:数据存储没有固定的格式,并且可以进行横向扩展。

    NoSQL泛指非关系型数据库,随着web2.0互联网的诞生,传统的关系型数据库很难对付web2.0时代!尤其是超大规模的高并发的社区,暴露出来很多难以克服的问题,NoSQL在当今大数据环境下发展的十分迅速,Redis是发展最快的。

    随着互联网网站的兴起,传统的关系数据库在应付动态网站,特别是超大规模和高并发的纯动态网站已经显得力不从心,暴露了很多难以克服的问题。如商城网站中对商品数据频繁查询对热搜商品的排行统计订单超时问题、以及微信朋友圈(音频,视频)存储等相关使用传统的关系型数据库实现就显得非常复杂,虽然能实现相应功能但是在性能上却不是那么乐观。nosql这个技术门类的出现,更好的解决了这些问题,它告诉了世界不仅仅是sql。

    了解:3V + 3高

    大数据时代的3V :主要是描述问题的

    1. 海量Velume
    2. 多样Variety
    3. 实时Velocity

    大数据时代的3高 : 主要是对程序的要求

    1. 高并发
    2. 高可扩
    3. 高性能

    3. NoSQL的四大分类

    3.1 键值(Key-Value)存储数据库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ## 1.说明: 
    - 这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。
    ## 2.特点
    - Key/value模型对于IT系统来说的优势在于简单、易部署。
    - 但是如果DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。
    ## 3.相关产品
    - Tokyo Cabinet/Tyrant,
    - Redis
    - SSDB
    - Voldemort
    - Oracle BDB

    3.2 列存储数据库

    1
    2
    3
    4
    5
    6
    ## 1.说明
    - 这部分数据库通常是用来应对分布式存储的海量数据。
    ## 2.特点
    - 键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。
    ## 3.相关产品
    - Cassandra、HBase、Riak.

    3.3 文档型数据库

    1
    2
    3
    4
    5
    6
    ## 1.说明
    - 文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可 以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高
    ## 2.特点
    - 以文档形式存储
    ## 3.相关产品
    - MongoDB、CouchDB、 MongoDb(4.x). 国内也有文档型数据库SequoiaDB,已经开源。

    3.4 图形(Graph)数据库

    1
    2
    3
    4
    5
    6
    ## 1.说明
    - 图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。
    - NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。
    ## 2.特点
    ## 3.相关产品
    - Neo4J、InfoGrid、 Infinite Graph、

    4. NoSQL应用场景

    • 数据模型比较简单
    • 需要灵活性更强的IT系统
    • 对数据库性能要求较高
    • 不需要高度的数据一致性

    5. 什么是Redis

    file

    Redis 开源 遵循BSD 基于内存数据存储 被用于作为 数据库 缓存 消息中间件 redis是一个内存型的数据库

    6. Redis特点

    • Redis是一个高性能key/value内存型数据库
    • Redis支持丰富的数据类型
    • Redis支持持久化
    • Redis单线程,单进程

    单线程不一定比多线程慢,在CPU中,多线程需要跳转,而单线程不需要,减少了跳转的消耗,所以在某些场景里单线程可能比多线程快。

    7. Ridis安装

    8. redis常用命令

    8.1 set get命令,存值,取值

    file

    8.2 切换数据库,redis默认有16个数据库,默认使用0号数据库,可以通过select切换

    file

    file

    8.3 清空当前数据库:flushdb,清空所有数据库:flushall

    file

    8.4 查询所有key: keys*

    file

    8.5 查询数据库的大小:dbsize

    file

    8.6 查看key是否存在:exists keyName,存在返回1,否则返回0

    file

    8.7 移除Key: move keyName 1

    file

    8.8 为key设置过期时间: expire keyName timeout

    file

    8.9 查看key的剩余存活时间:ttl keyName

    file

    8.10 查看key的类型:type keyName

    file

    9. String详解

    file

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    命令 说明
    ------------------------- -----------------------
    set 设置一个key/value
    get 根据key获得对应的value
    mset 一次设置多个key value
    mget 一次获得多个key的value
    getset 获得原始key的值,同时设置新值
    strlen 获得对应key存储value的长度
    append 为对应key的value追加内容
    getrange 索引0开始 截取value的内容
    setex 设置一个key存活的有效期(秒)
    psetex 设置一个key存活的有效期(毫秒)
    setnx 存在不做任何操作,不存在添加
    msetnx原子操作(只要有一个存在不做任何操作) 可以同时设置多个key,只有有一个存在都不保存
    decr 进行数值类型的-1操作
    decrby 根据提供的数据进行减法操作
    Incr 进行数值类型的+1操作
    incrby 根据提供的数据进行加法操作
    Incrbyfloat 根据提供的数据加入浮点数

    9.1 strlen:求value的长度,append:追加

    file

    9.2 自增,自减操作:incr incrby decr decrby

    file

    9.3 字符串的范围操作:getrange,setrange

    file

    9.4 设置过期时间:setex(如果存在Key则覆盖,不存在则创建),setnx(如果不存在就设置)

    file

    9.5 批量设置和获取值:mset,mget, msetnx(操作为原子性,要么都成功,要么都失败)

    file

    9.6 存取对象

    file

    9.7 组合操作:getset先获取再设置,如果不存在就返回nil

    file

    String类似的使用场景:value除了是我们的字符串还可以是我们的数字!

    • 计数器
    • 统计多单位的数量
    • 粉丝数
    • 对象缓存存储

    10. list详解

    list的命令都是l开头,list 列表 相当于java中list 集合 特点 元素有序 且 可以重复

    file

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    命令       说明                    
    ------- ---------------------
    lpush 将某个值加入到一个key列表头部
    lpushx 同lpush,但是必须要保证这个key存在
    rpush 将某个值加入到一个key列表末尾
    rpushx 同rpush,但是必须要保证这个key存在
    lpop 返回和移除列表左边的第一个元素
    rpop 返回和移除列表右边的第一个元素
    lrange 获取某一个下标区间内的元素
    llen 获取列表元素个数
    lset 设置某一个指定索引的值(索引必须存在)
    lindex 获取某一个指定索引位置的元素
    lrem 删除重复元素
    ltrim 保留列表中特定区间内的元素
    linsert 在某一个元素之前,之后插入新元素

    10.1 左插:lpush,左删:lpop

    file

    10.2 右插:rpush,右删:rpop

    file

    10.3 获取列表元素:lrange

    file

    10.4 通过下标获取元素:lindex

    file

    10.5 获取列表长度:llen

    file

    10.6 移除具体的值所在的键值对:lrem 列表 移除几个 移除的具体value

    file

    10.7 截取操作:ltrim 列表 截取的开始下标 截取的结束下标

    file

    10.8 rpoplpush:移除列表中的最后一个元素并将这个元素放到一个新的列表中

    file

    10.9 判断列表是否存在:EXISTS list

    file

    10.10 lset:更新列表中指定下标的元素的value,前提是该下标必须有值,否则报错

    file

    10.11 在列表中插入值:前插和后插:linsert

    file

    11. set详解

    set是无序不重复集合,set命令都是s开头 file

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    命令           说明                        
    ----------- -------------------------
    sadd 为集合添加元素
    smembers 显示集合中所有元素 无序
    scard 返回集合中元素的个数
    spop 随机返回一个元素 并将元素在集合中删除
    smove 从一个集合中向另一个集合移动元素 必须是同一种类型
    srem 从集合中删除一个元素
    sismember 判断一个集合中是否含有这个元素
    srandmember 随机返回元素
    sdiff 去掉第一个集合中其它集合含有的相同元素
    sinter 求交集
    sunion 求和集

    11.1 添加:sadd

    file

    11.2 查看所有: smembers

    file

    11.3 查询set的元素个数:scard

    file

    11.4 判断set中是否存在某元素:sismember

    file

    11.5 移除某个元素:srem

    file

    11.6 随机抽取一个元素:SRANDMEMBER

    file

    11.7 随机移除一个元素:spop

    file

    11.8 将一个集合中的元素移动到另一个集合中:smove

    file

    11.9 集合之间求交并补集:sinter sunite sdiff

    file

    差集sdiff

    file

    交集sinter

    file

    并集sunion

    file

    12. hash详解

    hash的形式:key filed vlaue,相当于java中的map集合 hash命令都是h开头

    file

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    命令            说明              
    ------------ ---------------
    hset 设置一个key/value对
    hget 获得一个key对应的value
    hgetall 获得所有的key/value对
    hdel 删除某一个key/value对
    hexists 判断一个key是否存在
    hkeys 获得所有的key
    hvals 获得所有的value
    hmset 设置多个key/value
    hmget 获得多个key的value
    hsetnx 设置一个不存在的key的值
    hincrby 为value进行加法运算
    hincrbyfloat 为value加入浮点值

    12.1 向hash中添加值:hset

    file

    12.2 得到hash中的指定filed的值:hget

    file

    12.3 得到hash中的所有值:hgetall

    file

    12.4 批量添加和获取:hmset hmget

    file

    12.5 删除指定的字段:hdel

    file

    12.6 获取hash的字段长度:hlen

    file

    12.7 判断hash中的字段是否存在:hexist

    file

    12.8 获取所有的key(字段)hkeys,获取所有的value:hvals

    file

    12.9 指定增量:hincrby

    file

    hash变更的数据 user name age,尤其是是用户信息之类的,经常变动的信息! hash 更适合于对象的存储,String更加适合字符串存储!

    13. Zset详解

    zset是有序不可重复的集合,zset命令都是z开头 file

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    命令                      说明             
    ---------------------- --------------
    zadd 添加一个有序集合元素
    zcard 返回集合的元素个数
    zrange 升序 zrevrange 降序 返回一个范围内的元素
    zrangebyscore 按照分数查找一个范围内的元素
    zrank 返回排名
    zrevrank 倒序排名
    zscore 显示某一个元素的分数
    zrem 移除某一个元素
    zincrby 给某个特定元素加分

    13.1 添加数据:zadd

    file

    13.2 获取所有值,按照索引获取:zrange

    file

    13.3 获取所有值,按照score获取:zrangebyscore

    file

    13.4 移除元素:zrem

    file

    13.5 得到元素的个数:zcard

    file

    13.6 获取指定区间的成员数量:zcount

    file

    ZSET 官方 可排序SET sortSet

    14. geospatial

    15. bitmaps

    bitmap即位存储,适用于只有两面性的内容。如:可以用bitmap存储用户是否登录,是否注册,是否打卡等等。bitmap的值只有0和1两个值。

    15.1 存储数据:setbit

    file

    15.2 获取指定下标的值:getbit

    file

    15.3 统计bitmap中1的位数:bitcount

    file

    16. hyperloglogs

    用于统计基数(即不重复的数据),可以用于统计网页访问量

    16.1 添加:pfadd

    file

    16.2 计数:pfcount

    file

    16.3 合并:pfmerge

    file

    本文作者:jujimeizuo
    本文地址https://blog.jujimeizuo.cn/2021/09/24/redisleixing/
    本博客所有文章除特别声明外,均采用 CC BY-SA 3.0 协议。转载请注明出处!