认识NoSQL

SQLNoSQL
数据结构结构化非结构化
数据关联关联的非关联的
查询方式SQL查询非SQL查询
事务特性ACIDBASE
存储方式磁盘内存
扩展性垂直水平
使用场景1、数据结构固定2、相对业务对数据安全性一致性要求高1、数据结构不固定2、对一致性、安全性要求不高3、对性能要求

认识Redis

redis诞生于2009年全称(Remote Dictionary Serve),远程词典服务器,是一个基于内存的NoSQL数据库。

特征:

  1. 键值类型,valu支持多种不同数据结构,功能丰富。
  2. 单线程,每个命令具备原子性。
  3. 低延迟,速度快(基于内存,IO多路复用、良好的编码)。
  4. 支持数据持久化。
  5. 支持主从集群、分片集群。
  6. 支持多语言客户端。

数据结构

通用命令

KEYS

KEYS pattern

summary: Find all keys matching the given pattern

DEL

DEL key [key ...]

summary: Delete a key

EXISTS

EXISTS key [key ...]

summary: Determine if a key exists

EXPIRE

EXPIRE key seconds

summary: Set a key's time to live in seconds

TTL

TTL key

summary: Get the time to live for a key

注:当查询出来的结果为-2时,则表示该key已经不存在。-1表示永久有效,1表示有时效性。

Key的结构

Redis的key允许有多个单词形成层级结构,多个单词之间用:隔开,格式如下:

项目名称:业务名:类型:id

格式非固定,可根据自己的需求来删除或添加词条。

数据类型

String类型(最大不能超过512m):

字符串类型,是redis中最简单的存储类型。

其value是字符串,不过根据字符串的格式不同,有可以分为3类:

string:普通字符串

int:整数类型,可以做自增,自减操作

float:浮点类型,可以做自增,自减操作

常见命令

SET:添加或这修改已经存在的一个String类型的键值对

GET:根据key获取SDtring类型的value

MSET:批量添加多个String类型的键值对

MGET:根据多个key获取多个String类型的value。

INCR:让一个整型的key自增1。

INCRBY:让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2。

INCRBYFLOAT:让一个浮点型key自增并设置步长。

SETNX:添加一个String类型键值对,前提是这个key不存在,否则不执行。

SETEX:添加一个String类型的键值对,并且执行有效期。

Hash类型:

也称散列,其value是一个无序字典,类似于Java中的HashMap结构。

常见命令

HSET:添加或者修改hash类型key的field的值

HGET:获取一个hash类型key的value的值。

HMSET:批量添加多个hash类型key的field的值。

HMGET:批量获取多个hash类型key的field的值。

HGETALL:获取一个hash类型下key的所有field的值。

HKEYS:获取一个hash类型中所有的field字段。

HVALS:获取一个hash类型中key的中所有的value值。

HINCRBY:让一个hash类型key的字段值自增并指定步长。

HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行。

List类型:

redis中list类型与java中的linkedList类似,可以看做是一个双向链表。既可以正向所检索也可以支持反向检索。

特征:

  1. 有序
  2. 元素可重复
  3. 插入和删除快
  4. 查询速度一般

常见命令

LPUSH:向列表左侧插入一个或多个元素。

LPOP:移除并返回列表左侧的第一个元素,没有则返回nil

RPUSH:向列表右侧插入一个或多个元素。

RPOP:移除并返回列表右侧第一个元素,没有则返回nil

LRANGE:返回一段角标内的所有元素。LRANGE key star end

BLPOP和BRPOP:与RPOP和LPOP类似,没有元素时等待指定时间,而不是返回nil。

注:

返回列表中所有元素LRANGE key 0 -1

提出问题:

如何利用List结构模拟一个栈(先进后出)?

入口和出口都是在一边

如何利用List结构模拟一个队列(先进先出)?

入口和出口不在同一边

如何利用List结构模拟一个阻塞队列?

入口出口不同

出队时采用BLPOP或BRPOP

Set类型:

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

特征

  1. 无序
  2. 元素不可重复
  3. 查找快
  4. 支持交集、并集、差集等功能。

常见命令

SADD key member:向set中增加一个或多个元素。

SREM key member:移除set中指定元素。

SCARD key:返回set中元素的个数。

SISMEMBER key member:判断一个元素是否存在于set中。

SMEMBERS:获取set中所有的元素。

SINTER key1 key2……:求key之间的交集。

SDIFF key1 key2 ……:求key之间的差集。

SUNION key1 key2 ……:求key之间的并集。

案例



sadd zhangsan lisi wangwu zhaoliu
sadd lisi wangwu mazi ergou

SotredSet类型:

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

特性

  1. 可排序
  2. 元素不重复
  3. 查询速度快

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

常见命令

ZADD key score member:添加一个或多个元素到sorted set,如果已经存在则更新其score值。

ZREM key member:删除SortedSet中的一个指定元素。

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即可。

案例


zadd stus 85 Jack 85 Lucy 89 Rose 82 Tom 95 Jerry 78 Amy 92 Miles

今天的学习到此结束吧。

最后修改:2024 年 05 月 01 日
如果觉得我的文章对你有用,请随意赞赏