目录
首先来介绍一下什么是非关系型数据库有哪些类型:
键值(key-value)存储数据库 | 这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。 |
列存储数据库 | 这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列,这些列是由列家族来安排的。 |
文档型数据库 | 该类型的数据模型 是版本化的文档,半结构化的文档以特定的格式存储,如JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。 |
图形数据库 | 图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST格式的数据接口或者查询API。 |
一、redis介绍
是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行,并支持持久化。是当前比较热门的NOSQL数据库之一,也被人们称之为数据机构服务器
其支持的数据类型:字符串类型、散列类型、列表类型、集合类型、有序集合类型、坐标类型。
redis能够干什么
内存存储和持久化:redis支持异步将内存中的数据写入到磁盘中,同时不影响继续服务 |
取最新N个数据的操作,可以将排行或者指定信息保存在Redis集合容器内 |
模拟类似于HttpSession(会话对象)这种需要设定过期时间的功能 |
定时器 计数器 |
消息的订阅和消息的发布(消息队列 主从配置) |
特点
性能非常高:Redis读取速度 11W次/s 写入速度 8W次/s |
非常丰富的数据类型 :String List Hash Set ZSet等等数据类型操作 |
原子性:Redis内所有操作都是原子性的,意味着要么成功执行,要么失败完全不执行。单个操作是原子性的,多个操作也支持事务。 |
数据持久化:可以将内存中的数据保存在磁盘内,重启的时候可以加载进行使用 |
Redis还支持publish/subscribe 通知,key值生命周期的管理,提供了目前主流编程语言的API接口 |
最后可使用在线安装yum install redis,然后用redis-server启动
二、数据类型
2.1key类型
KEYS * 匹配数据库中所有key
命令语法 | 描述 |
DEL key (del) | 该命令用于在 key 存在时删除 key |
DUMP key (dump) | 序列化给定 key ,并返回被序列化的值 |
EXISTS key (exists) | 检查给定 key 是否存在,存在返回1,否则返回0 |
EXPIRE key second (expire) | 为给定 key 设置过期时间,以秒计 |
EXPIREAT key timestamp (expireat) | EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳 |
PEXPIRE key milliseconds (pexpire) | 设置 key 的过期时间以毫秒计 |
PEXPIREAT key milliseconds-timestamp | 设置 key 过期时间的时间戳(unix timestamp) 以毫秒计 |
KEYS pattern | 查找所有符合给定模式( pattern)的 key |
MOVE key db | 将当前数据库的 key 移动到给定的数据库 db 当中 |
PERSIST key (persist) | 移除 key 的过期时间,key 将持久保持 |
PTTL key | 以毫秒为单位返回 key 的剩余的过期时间 |
TTL key | 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live) |
RANDOMKEY (randomkey) | 从当前数据库中随机返回一个 key |
RENAME key newkey | 修改 key 的名称 |
RENAMENX key newkey | 仅当 newkey 不存在时,将 key 改名为 newkey |
SCAN cursor [MATCH pattern] [COUNT count] | 迭代数据库中的数据库键 |
TYPE key | 返回 key 所储存的值的类型 |
SELECT db | 选择数据库 数据库为0-15(默认一共16个数据库) |
DBSIZE (dbsize) | 查看数据库的key数量 |
FLUSHDB (flushdb) | 清空当前数据库 |
FLUSHALL | 清空所有数据库 |
ECHO | 打印命令 |
2.2 String
String 类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。String 类型是 Redis 最基本的数据类型,String 类型的值最大能存储 512MB。String类型一般用于缓存、限流、计数器、分布式锁、分布式Session。
语法 | 描述 |
SET key value | 设置指定 key 的值 |
GET key | 获取指定 key 的值 |
GETRANGE key start end (getrange) | 返回 key 中字符串值的子字符,end=-1时表示全部 |
SETBIT key offset value (setbit) | 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit) |
MSET key value [key value ...] | 同时设置一个或多个 key-value 对 |
MGET key1 [key2..] | 获取所有(一个或多个)给定 key 的值 |
GETSET key value | 将给定 key 的值设为 value ,并返回 key 的旧值(old value) |
SETNX key value (setnx) | 只有在 key 不存在时设置 key 的值 |
STRLEN key (strlen) | 返回 key 所储存的字符串值的长度 |
MSETNX key value [key value ...] | 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在 |
INCR key (incr) | 将 key 中储存的数字值增1 |
DECR key (decr) | 将 key 中储存的数字值减1 |
INCRBY key increment (incrby) | 将 key 所储存的值加上给定的增量值 |
DECRBY key decrement (decrby) | 将 key 所储存的值减少给定的增量值 |
APPEND key value (append) | 如果 key 已经存在并且是一个字符串,APPEND 命令将指定的 value 追加到该 key 原来值 value 的末尾 |
2.3 List
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)一个列表最多可以包含 2^32^ - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
其相关语法和String类似,可直接使用其语法来实现
2.4 Set
Redis 的 Set 是 String 类型的无序(号)集合。集合中成员是唯一的,这就意味着集合中不能出现重复的数据。Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 2^32^ - 1 (4294967295, 每个集合可存储40多亿个成员)。
语法 | 描述 |
SADD key member1 [member2] | 向集合添加一个或多个成员 |
SMEMBERS key | 返回集合中的所有成员 |
SCARD key (scard) | 获取集合的成员数 |
SRANDMEMBER key [count] (srandmember) | 返回集合中一个或多个随机数 |
SISMEMBER key member (sismember) | 判断 member 元素是否是集合 key 的成员 |
SREM key member1 [member2] (srem) | 移除集合中一个或多个成员 |
SDIFF key1 [key2] (sdiff) | 返回给定所有集合的差集 |
SINTER key1 [key2] (sinter) | 返回给定所有集合的交集 |
SUNION key1 [key2] (sunion) | 返回所有给定集合的并集 |
SPOP key | 移除并返回集合中的一个随机元素 |
SSCAN key cursor | 迭代集合中的元素 |
2.5 Zset
Redis 有序集合和集合一样也是string类型元素的集合且不允许重复的成员。不同的是每个元素都会关联一个==double类型的分数==。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 2^32^ - 1 (4294967295, 每个集合可存储40多亿个成员)。
序号 | 命令语法 | 描述 |
---|---|---|
1 | ZADD key score1 member1 [score2 member2] | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
2 | ZCARD key | 获取有序集合的成员数 |
3 | ZCOUNT key min max | 计算在有序集合中指定区间分数的成员数 |
4 | ZRANK key member | 返回有序集合中指定成员的索引 |
5 | ZSCORE key member | 返回有序集中,成员的分数值 |
6 | ZREM key member [member ...] | 移除有序集合中的一个或多个成员 |
2.6 Hash
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。Redis 中每个 hash 可以存储 2^32^ - 1 键值对(40多亿)。
Hash类型一般用于存储用户信息、用户主页访问量、组合查询等。
序号 | 命令语法 | 描述 |
---|---|---|
1 | HSET key field value | 将哈希表 key 中的字段 field 的值设为 value |
2 | HGET key field | 获取存储在哈希表中指定字段的值 |
3 | HGETALL key | 获取在哈希表中指定 key 的所有字段和值 |
4 | HEXISTS key field | 查看哈希表 key 中,指定的字段是否存在 |
5 | HKEYS key | 获取所有哈希表中的字段 |
6 | HVALS key | 获取哈希表中所有值 |
7 | HLEN key | 获取哈希表中字段的数量 |
8 | HMGET key field1 [field2] | 获取所有给定字段的值 |
9 | HMSET key field1 value1 [field2 value2] | 同时将多个 field-value (域-值)对设置到哈希表 key 中 |
2.7 Bitmaps
Redis 6 中提供了 Bitmaps 这个“数据类型”可以实现对位的操作:
1)Bitmaps本身不是一种数据类型,实际上它就是字符串(key-value),但是它可以对字符串的位进行操作。
2)Bitmaps单独提供了一套命令,所以在Redis中使用Bitmaps和使用字符串的方法不太相同。 可以把Bitmaps想象成一个以位为单位的数组, 数组的每个单元只能存储0和1, 数组的下标在Bitmaps中叫做偏移量。
1、setbit
这个命令用于设置Bitmaps中某个偏移量的值(0或1),offset偏移量从0开始。
setbit <key> <offset> <value>
例如,把每个独立用户是否访问过网站存放在Bitmaps中, 将访问的用户记做1,没有访问的用户记做0,用偏移量作为用户的id。
设置键的第offset个位的值(从0算起) , 假设现在有20个用户,userid=1,6,11,15,19的用户对网站进行了访问, 那么当前Bitmaps初始化结果如图:
设置独立访问的用户bitmaps
127.0.0.1:6379> setbit unique:users:20220718 1 1
127.0.0.1:6379> setbit unique:users:20220718 6 1
127.0.0.1:6379> setbit unique:users:20220718 11 1
127.0.0.1:6379> setbit unique:users:20220718 15 1
127.0.0.1:6379> setbit unique:users:20220718 19 1
2、getbit
这个命令用于获取Bitmaps中某个偏移量的值。格式为
getbit <key> <offset>
获取键的第offset位的值(从0开始算)。例如获取id=6的用户是否在2022-07-18这天访问过, 返回0说明没有访问过:
127.0.0.1:6379> getbit unique:users:20220718 6
127.0.0.1:6379> getbit unique:users:20220718 7
3、bitcount
这个命令用于统计字符串被设置为1的bit数。一般情况下,给定的整个字符串都会被进行计数,通过指定额外的 start 或 end 参数,可以让计数只在特定的位上进行。start 和 end 参数的设置,都可以使用负数值:比如 -1 表示最后一个位,而 -2 表示倒数第二个位,start、end 是指bit组的字节的下标数,二者皆包含。
bitcount <key> [start end]
用于统计字符串从start字节到end字节比特值为1的数量。例如,统计id在第1个字节到第3个字节之间的独立访问用户数, 对应的用户id是11, 15, 19。
127.0.0.1:6379> bitcount unique:users:20220718 1 3
4、bitop
这个命令是一个复合操作, 它可以做多个Bitmaps的and(交集) 、 or(并集) 、 not(非) 、 xor(异或) 操作并将结果保存在destkey中。
bitop and(or/not/xor) <destkey> [key…]
计算出两天都访问过网站的用户数量
127.0.0.1:6379> bitop and unique:users:and:20201104_03 unique:users:20201103 unique:users:20201104
127.0.0.1:6379> bitcount unique:users:and:20201104_03
2.8HyperLogLog
HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是:在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
序号 | 命令语法 | 描述 |
---|---|---|
1 | PFADD key element [element ...] (pfadd) | 添加指定元素到 HyperLogLog 中 |
2 | PFCOUNT key [key ...] (pfcount) | 返回给定 HyperLogLog 的基数估算值 |
3 | PFMERGE destkey sourcekey [sourcekey ...] (pfmerge) | 将多个 HyperLogLog 合并为一个 HyperLogLog |
2.9 Geospatial
Redis 3.2 中增加了对GEO类型的支持。GEO,Geographic,地理信息的缩写。该类型,就是元素的2维坐标,在地图上就是经纬度。redis基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬度Hash等常见操作。
序号 | 命令语法 | 描述 |
---|---|---|
1 | geoadd key longitude latitude member [longitude latitude member...] | 添加地理位置(经度,纬度,名称) |
2 | geopos key member [member...] | 获得指定地区的坐标值 |
3 | geodist key member1 member2 [m|km|ft|mi] | 获取两个位置之间的直线距离 |
4 | georadius key longitude latitude radius [m|km|ft|mi] | 以给定的经纬度为中心,找出某一半径内的元素 |