8

Redis概述及基本数据结构 - 染沁

 2 years ago
source link: https://www.cnblogs.com/lcha-coding/p/16306038.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

SQL vs NoSQL

    • SQL 是结构化的,一旦定义了表结构,以后在维护数据的时候必须严格遵守定义的结构。
    • NoSQL 是非结构化的,常见的形式有 Redis 的 Key-Value 存储形式、Document 文档型存储形式、Graph 图类型存储形式
    • SQL 数据库可以通过如外键的方式去维护数据与数据之间的关联

    • NoSQL 是非关系型的,如果想要维护数据与数据之间的关系,通常通过 json 格式的数据进行维护

      {
          id: 1,
          name: "张三",
          orders: [
              {
                  id: 1,
                  item: {
                      id: 10,
                      title: "荣耀6",
                      price: 4999
                  }
              },
              {
                  id: 2,
                  item: {
                      id: 20,
                      title: "小米11",
                      price: 3999
                  }
              }
          ]
      }
      
  1. SQL查询

    • SQL 的查询有自己的语法,格式固定,语法固定,兼容性起强
    • NoSQL 的查询语句不同意,没有固定的形式
    • SQL 的所有数据库都是可以实现 ACID 的
    • NoSQL 数据库要么没有事务,要么只能满足事务最基本的一些一致性

认识 Redis

Redis 是一个基于内存的键值型 NoSQL 数据库

特征:

  • 键值型:value 支持多种不同数据类型,功能丰富
  • 单线程:每个命令具备原子性
  • 延迟低、速度快:基于内存、IO多路复用、良好的编码
  • 支持数据持久化
  • 支持主从集群、分片集群
  • 支持多语言客户端:Java、C等等

Redis 数据结构

Redis是一个 key-value 的数据库,key 一般是 String 类型,不过 value 的类型多种多样:

名称 示例
String hello world
Hash {name: “Jack”, age: 21}
List [A -> B -> C]
Set {A,B,C}
SortedSet {A: 1, B: 2, C: 3}

[问题]:Redis 没有类似 MySql 中的 Table 的概念,要怎么区分不同类型的 key 呢?

[解决方法]:Redis 的 key 支持有多个单词形成层次结构,多个单词之间用“ :”隔开。例如 myproduct:user:1 myproduct:product:1

KEY VALUE
myproduct:user:1 {"id": 1, "name": "Jack", "age": 21}
myproduct:product:1 {"id": 1,"name": "小米11", "price": 4999}

Redis 通用命令

  • KEYS:查看符合模板的所有 key。不建议在生产环境上使用
  • DEL:删除一个指定的 key
  • EXISTS:判断 key 是否存在
  • EXPIRE:给一个 key 设置有效期,有效期到期时该 key 会被自动删除
  • TTL:查看一个 key 剩余的有效期

String 类型

String 类型介绍

String 类型是 Redis 中最简单的存储类型,其 value 是字符串。不过根据字符串格式不同,又具体分为三类:

  • string:普通字符串
  • int:整数类型,可以做自增自减操作
  • float:浮点类型,可以做自增自减操作

String 类型常见命令

  • SET:添加或者修改已经存在的一个String类型的键值对
  • GET:根据key获取String类型的value
  • MSET:批量添加多个String类型的键值对
  • MGET:根据多个key获取多个String类型的value
  • INCR:让一个整型的key自增1
  • INCRBY:让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2
  • INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
  • SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行
  • SETEX:添加一个String类型的键值对,并且指定有效期

Hash 类型

Hash 类型介绍

Hash 类型,也叫散列,其 value 是一个无序字典,类似于 Java 中的 HashMap 结构。Hash 结构可以将对象中的每个字段独立存储,可以针对单个字段做 CRUD。

Hash 类型常用命令

  • HSET key field value:添加或者修改hash类型key的field的值
  • HGET key field:获取一个hash类型key的field的值
  • HMSET:批量添加多个hash类型key的field的值
  • HMGET:批量获取多个hash类型key的field的值
  • HGETALL:获取一个hash类型的key中的所有的field和value
  • HKEYS:获取一个hash类型的key中的所有的field
  • HVALS:获取一个hash类型的key中的所有的value
  • HINCRBY:让一个hash类型key的字段值自增并指定步长
  • HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行

List 类型

List 类型介绍

Redis 中的 List 类型与 Java 中的 LinkedList 类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。其特征也与 LinkedList 类似。

List 类型常用命令

  • LPUSH key element ... :向列表左侧插入一个或多个元素
  • LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil
  • RPUSH key element ... :向列表右侧插入一个或多个元素
  • RPOP key:移除并返回列表右侧的第一个元素
  • LRANGE key star end:返回一段角标范围内的所有元素
  • BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil

Set 类型

Set 类型介绍

Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征。

Set 类型常用命令

  • SADD key member ... :向set中添加一个或多个元素
  • SREM key member ... : 移除set中的指定元素
  • SCARD key: 返回set中元素的个数
  • SISMEMBER key member:判断一个元素是否存在于set中
  • SMEMBERS:获取set中的所有元素
  • SINTER key1 key2 ... :求key1与key2的交集
  • SDIFF key1 key2 ... :求key1与key2的差集
  • SUNION key1 key2 ..:求key1和key2的并集

SortedSet 类型

SortedSet 类型介绍

Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表。

其具备以下特征:

  • 元素不重复
  • 查询速度快

因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。

SortedSet 类型常用命令

  • ZADD key score member:添加一个或多个元素到sorted set ,如果已经存在则更新其score值
  • ZREM key member:删除sorted set中的一个指定元素
  • ZSCORE key member : 获取sorted set中的指定元素的score值
  • ZRANK key member:获取sorted set 中的指定元素的排名
  • ZCARD key:获取sorted set中的元素个数
  • ZCOUNT key min max:统计score值在给定范围内的所有元素的个数
  • ZINCRBY key increment member:让sorted set中的指定元素自增,步长为指定的increment值
  • ZRANGE key min max:按照score排序后,获取指定排名范围内的元素
  • ZRANGEBYSCORE key min max:按照score排序后,获取指定score范围内的元素
  • ZDIFF、ZINTER、ZUNION:求差集、交集、并集

注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK