您当前的位置: 首页 >  大数据

white camel

暂无认证

  • 1浏览

    0关注

    442博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Redis——NOSQL、Redis概述、通用命令、Redis五大数据类型、三大特殊类型

white camel 发布时间:2020-02-21 19:57:24 ,浏览量:1

目录
  • NOSQL概述
  • NOSQL和关系型数据库比较
  • NOSQL的优缺点
    • 非关系型数据库的优势
    • 关系型数据库的优势
  • 主流的NOSQL产品
  • Redis概述
  • Redis的通用命令
  • Redis的五种数据类型
    • 字符串类型String
    • 哈希类型hash
    • 有序可重复列表类型list
    • 无序不可重复列表类型set
    • 有序结合类型sortset
  • Redis三种特殊数据类型
NOSQL概述

跳转到目录

  • NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库
  • 随着互联网web2.0网站(动态网站)的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。
  • NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
NOSQL和关系型数据库比较

跳转到目录 在这里插入图片描述

NOSQL的优缺点

跳转到目录

  • 优点:

    • 成本:nosql数据库简单易部署,基本都是开源软件,不需要像使用oracle那样花费大量成本购买使用,相比关系型数据库价格便宜。
    • 查询速度:nosql数据库(Redis)将数据存储于内存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql数据库。
    • 存储数据的格式:nosql的存储格式是 key,value形式、文档形式、图片形式 等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型。
    • 扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。
  • 缺点:

    • 维护的工具和资料有限,因为nosql是属于新的技术,不能和关系型数据库10几年的技术同日而语。
    • 不提供对sql的支持,如果不支持sql这样的工业标准,将产生一定用户的学习和使用成本。
非关系型数据库的优势

跳转到目录

  • 性能NOSQL(Redis) 是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。 在这里插入图片描述

  • 可扩展性同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。

关系型数据库的优势

跳转到目录

  • 复杂查询可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。
  • 事务支持使得对于安全性能很高的数据访问要求得以实现。对于这两类数据库,对方的优势就是自己的弱势,反之亦然。
总结
  • 关系型数据库与NoSQL数据库并非对立而是互补的关系,即通常情况下使用关系型数据库,在适合使用NoSQL的时候使用NoSQL数据库,让NoSQL数据库对关系型数据库的不足进行弥补。
  • 一般会将数据存储在关系型数据库中,在nosql数据库中备份存储关系型数据库的数据 (一般存储一些关系数据库中的热点数据, 高频不常修改的数据)
主流的NOSQL产品

跳转到目录 在这里插入图片描述

  • 键值(Key-Value)存储数据库
    • 相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
    • 典型应用: 内容缓存,主要用于处理大量数据的高访问负载
    • 数据模型: 一系列键值对 (string, list, set, hash, zset 五种常用类型)
    • 优势: 快速查询
    • 劣势: 存储的数据缺少结构化
  • 存储数据库
    • 相关产品:Cassandra, HBase, Riak
    • 典型应用:分布式的文件系统
    • 数据模型:以列簇式存储,将同一列数据存在一起
    • 优势:查找速度快,可扩展性强,更容易进行分布式扩展
    • 劣势:功能相对局限
  • 文档型数据库
    • 相关产品:CouchDB、MongoDB
    • 典型应用:Web应用(与Key-Value类似,Value是结构化的)
    • 数据模型: 一系列键值对
    • 优势:数据结构要求不严格
    • 劣势: 查询性能不高,而且缺乏统一的查询语法
  • 图形(Graph)数据库
    • 相关数据库:Neo4J、InfoGrid、Infinite Graph
    • 典型应用:社交网络
    • 数据模型:图结构
    • 优势:利用图结构相关算法。
    • 劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
Reids概述

跳转到目录 Redis是用C语言开发的一个开源的 高性能键值对(key-value)数据库,redis就是在内存中的一个大的Map集合,官方提供测试数据,50个并发执行100000个请求,的速度是110000次/s,的速度是81000次/s ,且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis主要支持的键值数据类型如下:key为字符串类型, value为任意类型;

  • 字符串类型 string Map
  • 散列类型 hash Map
  • 列表类型 list Map>
  • 集合类型 set Map>
  • 有序集合类型 sortedset Map> 在这里插入图片描述

应用场景:

  • 缓存(热点数据查询、短连接、新闻内容、商品内容等等) 在这里插入图片描述
  • 聊天室的在线好友列表
  • 任务队列。(秒杀、抢购、12306等等)
  • 应用排行榜
  • 网站访问统计
  • 数据过期处理(可以精确到毫秒
  • 分布式集群架构中的session分离
Redis的下载和安装

跳转到目录

  • 官网下载: http://redis.io/download
  • github下载: https://github.com/microsoftarchive/redis

window版Redis的目录结构

目录或文件作用redis-benchmark性能测试工具redis-check-aofAOF文件修复工具redis-check-dumpRDB文件检查工具(快照持久化文件)redis-cli命令行客户端redis-server redis服务器启动命令redis.windows.conf redis核心配置文件

Windows服务

  • 安装windows服务: redis-server.exe --service-install redis.windows.conf --loglevel verbose
  • 卸载windows服务: redis-server --service-uninstall
Redis数据库相关指令 1、 数据库操作指令
# 1.Redis中库说明
- 使用redis的默认配置启动redis服务后,默认会存在16个库,编号从0-15
- 可以使用select 库的编号 来选择一个redis的库

# 2.Redis中操作库的指令
- 清空当前的库  FLUSHDB
- 清空全部的库  FLUSHALL

# 3.redis客户端显示中文
-	./redis-cli  -p 7000 --raw
2、 操作key相关指令
# 1.DEL指令
- 语法 :  DEL key [key ...] 
- 作用 :  删除给定的一个或多个key 。不存在的key 会被忽略。
- 可用版本: >= 1.0.0
- 返回值: 被删除key 的数量。 

# 2.EXISTS指令
- 语法:  EXISTS key
- 作用:  检查给定key 是否存在。
- 可用版本: >= 1.0.0
- 返回值: 若key 存在,返回1 ,否则返回0。

# 3.EXPIRE
- 语法:  EXPIRE key seconds
- 作用:  为给定key 设置生存时间,当key 过期时(生存时间为0 ),它会被自动删除。
- 可用版本: >= 1.0.0
- 时间复杂度: O(1)
- 返回值:设置成功返回1 。

# 4.KEYS
- 语法 :  KEYS pattern
- 作用 :  查找所有符合给定模式pattern 的key 。
- 语法:
	KEYS * 匹配数据库中所有key 。
	KEYS h?llo 匹配hello ,hallo 和hxllo 等。
	KEYS h*llo 匹配hllo 和heeeeello 等。
	KEYS h[ae]llo 匹配hello 和hallo ,但不匹配hillo 。特殊符号用 "\" 隔开
- 可用版本: >= 1.0.0
- 返回值: 符合给定模式的key 列表。

# 5.MOVE
- 语法 :  MOVE key db
- 作用 :  将当前数据库的key 移动到给定的数据库db 当中。
- 可用版本: >= 1.0.0
- 返回值: 移动成功返回1 ,失败则返回0 。

# 6.PEXPIRE
- 语法 :  PEXPIRE key milliseconds
- 作用 :  这个命令和EXPIRE 命令的作用类似,但是它以毫秒为单位设置key 的生存时间,而不像EXPIRE 命令那样,以秒为单位。
- 可用版本: >= 2.6.0
- 时间复杂度: O(1)
- 返回值:设置成功,返回1  key 不存在或设置失败,返回0

# 7.PEXPIREAT
- 语法 :  PEXPIREAT key milliseconds-timestamp
- 作用 :  这个命令和EXPIREAT 命令类似,但它以毫秒为单位设置key 的过期unix 时间戳,而不是像EXPIREAT那样,以秒为单位。
- 可用版本: >= 2.6.0
- 返回值:如果生存时间设置成功,返回1 。当key 不存在或没办法设置生存时间时,返回0 。(查看EXPIRE 命令获取更多信息)

# 8.TTL
- 语法 :   TTL key
- 作用 :   以秒为单位,返回给定key 的剩余生存时间(TTL, time to live)。
- 可用版本: >= 1.0.0
- 返回值:
	当key 不存在时,返回-2 。
	当key 存在但没有设置剩余生存时间时,返回-1 。
	否则,以秒为单位,返回key 的剩余生存时间。
- Note : 在Redis 2.8 以前,当key 不存在,或者key 没有设置剩余生存时间时,命令都返回-1 。

# 9.PTTL
- 语法 :  PTTL key
- 作用 :  这个命令类似于TTL 命令,但它以毫秒为单位返回key 的剩余生存时间,而不是像TTL 命令那样,以秒为单位。
- 可用版本: >= 2.6.0
- 返回值: 当key 不存在时,返回-2 。当key 存在但没有设置剩余生存时间时,返回-1 。
- 否则,以毫秒为单位,返回key 的剩余生存时间。
- 注意 : 在Redis 2.8 以前,当key 不存在,或者key 没有设置剩余生存时间时,命令都返回-1 。

# 10.RANDOMKEY
- 语法 :  RANDOMKEY
- 作用 :  从当前数据库中随机返回(不删除) 一个key 。
- 可用版本: >= 1.0.0
- 返回值:当数据库不为空时,返回一个key 。当数据库为空时,返回nil 。

# 11.RENAME
- 语法 :  RENAME key newkey
- 作用 :  将key 改名为newkey 。当key 和newkey 相同,或者key 不存在时,返回一个错误。当newkey 已经存在时,RENAME 命令将覆盖旧值。
- 可用版本: >= 1.0.0
- 返回值: 改名成功时提示OK ,失败时候返回一个错误。

# 12.TYPE
- 语法 :  TYPE key
- 作用 :  返回key 所储存的值的类型。
- 可用版本: >= 1.0.0
- 返回值:
	none (key 不存在)
	string (字符串)
	list (列表)
	set (集合)
	zset (有序集)
	hash (哈希表)
Redis的五种数据类型

跳转到目录

字符串类型String

跳转到目录 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型存入和获取的数据相同。在Redis中字符串类型的Value最多可以容纳的数据长度是512M

8.3 String类型 1. 内存存储模型
  • keyvalue都是string类型

在这里插入图片描述

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

表名 : 主键名 : 主键值 : 字段名

order : id : 10010 : name ------------------> {id:10010, name:张三}

key -----------------------------------------------------value

eg:

  • set key value 设定key持有指定的字符串value,如果该key存在则进行覆盖操作。总是返回”OK”

    127.0.0.1:6379> set company “sunny” OK 127.0.0.1:6379>

  • get key 获取key的value。如果与该key关联的value不是String类型,redis将返回错误信息,因为get命令只能用于获取String value;如果该key不存在,返回(nil)。

    127.0.0.1:6379> set name “sunny” OK 127.0.0.1:6379> get name “sunny”

  • del key 删除指定key

    127.0.0.1:6379> del name (integer) 1 127.0.0.1:6379> get name (nil)

    incr命令 自增 
    decr命令 自减 
    incrby key step 自增步数 
    decrby key step 自减步数
    
哈希类型hash

Map

跳转到目录 Redis中的Hash类型可以看成具有String Key和String Valuemap容器。所以该类型非常适合于存储值对象的信息。如Username、Password和Age等。如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对。

  • Map, 也就是说他的value是一个键值对

特点: value 是一个map结构 存在key value, key 无序的 , 5种数据类型key都是string类型的;

  • hash类型, key是string类型, value是map类型 ==> 每一个key都对应一个Map
1.内存模型

在这里插入图片描述

2.常用命令 命令说明hset设置一个key/value对hget获得一个key对应的valuehgetall获得所有的key/value对hdel删除某一个key/value对; 如果要删除大key, del key就将整个hash删除了hexists判断一个key是否存在hkeys获得所有的keyhvals获得所有的valuehmset设置多个key/valuehmget获得多个key的valuehsetnx设置一个不存在的key的值hincrby为value进行加法运算(value必须是数值类型)hincrbyfloat为value加入浮点值
  • hset key field value 为指定的key设定field/value对(键值对)。 注意:给同一个field设置值,后者会覆盖前面的

  • hmset key1 field/value key2 field/value 同时给多个key设定field/value

  • hget key field 返回指定的key中的field的值

  • hmget key field1 field2 field3 返回指定key的多个field的值

  • hdel key field [field … ] 可以删除一个或多个字段,返回值是被删除的字段个数

  • hgetall key 可以获取该键的所有数据

127.0.0.1:6379> hset user1 username xiaoming
(integer) 1
127.0.0.1:6379> hset user1 password 123
(integer) 1
127.0.0.1:6379> hset user1 email 123@qq.com
(integer) 1
127.0.0.1:6379> hmset user1 address beijing telephone 13422221123
OK
127.0.0.1:6379> hget user1 username
"xiaoming"
127.0.0.1:6379> hmget user1 username password address
1) "xiaoming"
2) "123"
3) "beijing"
127.0.0.1:6379> hgetall user1
 1) "username"
 2) "xiaoming"
 3) "password"
 4) "123"
 5) "email"
 6) "123@qq.com"
 7) "address"
 8) "beijing"
 9) "telephone"
10) "13422221123"
127.0.0.1:6379> hset user1 password 456
(integer) 0
127.0.0.1:6379> hgetall user1
 1) "username"
 2) "xiaoming"
 3) "password"
 4) "456"
 5) "email"
 6) "123@qq.com"
 7) "address"
 8) "beijing"
 9) "telephone"
10) "13422221123"
列表类型list类型 (有序 且 可重复)

类似双端队列的数据结构, 该类型可作为Redis实现消息队列的数据结构

跳转到目录 在Redis中,List类型是按照插入顺序排序的字符串链表 (双端队列)。和数据结构中的普通链表 (双端队列)一样,我们可以在其头部(left)尾部(right)添加新的元素。

在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是4294967295

  • list 列表 相当于java中list 集合 特点 元素有序可以重复;

  • key是string类型, value是list类型;

1.内存存储模型

类似 双端队列 在这里插入图片描述

2.常用操作指令 命令说明lpush将某个值加入到一个key列表头部lpushx同lpush,但是必须要保证这个key(列表)存在rpush将某个值加入到一个key列表末尾rpushx同rpush,但是必须要保证这个key存在lpop返回和移除列表左边的第一个元素rpop返回和移除列表右边的第一个元素lrange获取某一个下标区间内的元素llen获取列表元素个数lset设置某一个指定索引的值(索引必须存在)lindex获取某一个指定索引位置的元素lrem删除重复元素ltrim保留列表中特定区间内的元素linsert在某一个元素之前,之后插入新元素
  • lpush key values[value1 value2…] 在指定的key所关联的list的头部插入所有的values,如果该key不存在,该命令在插入的之前创建一个与该key 关联的空链表,之后再向该链表的头部插入数据。插入成功,返回元素的个数。

  • lpop key 返回并弹出指定的key关联的链表中的第一个元素,即头部元素。如果该key不存在,返回nil;若key存在,则返回链表的头部元素。

  • rpop key 从尾部弹出元素

  • lrange key start end :范围获取 遍历该键的所有数据

127.0.0.1:6379> lpush mylist1 a b c d e
(integer) 5
127.0.0.1:6379> rpush mylist1 x y z 1 2 3
(integer) 11
127.0.0.1:6379> lrange mylist1 0 10
 1) "e"
 2) "d"
 3) "c"
 4) "b"
 5) "a"
 6) "x"
 7) "y"
 8) "z"
 9) "1"
10) "2"
11) "3"
127.0.0.1:6379> rpop mylist1 3
(error) ERR wrong number of arguments for 'rpop' command
127.0.0.1:6379> rpop mylist1
"3"
127.0.0.1:6379> lrange mylist1 0 10
 1) "e"
 2) "d"
 3) "c"
 4) "b"
 5) "a"
 6) "x"
 7) "y"
 8) "z"
 9) "1"
10) "2"
列表类型set (无序 且 不可重复)

跳转到目录 在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。需要说明的是,这些操作的时间复杂度为O(1),即常量时间内完成次操作。Set可包含的最大元素数量是4294967295,和List类型不同的是,Set集合中不允许出现重复的元素。

  • 特点: Set类型 Set集合 元素无序 不可以重复
1.内存存储模型

在这里插入图片描述

2.常用命令 命令说明sadd为集合添加元素smembers显示集合中所有元素 无序scard返回集合中元素的个数spop随机返回一个元素 并将元素在集合中删除smove从一个集合中向另一个集合移动元素 必须是同一种类型srem从集合中删除一个元素sismember判断一个集合中是否含有这个元素srandmember随机返回元素sdiff去掉第一个集合中其它集合含有的相同元素sinter求交集sunion求和集
  • sadd key values[value1、value2…] 向set中添加数据,如果该key的值已有则不会重复添加
  • smembers key 获取set中所有的成员
  • srem key members[member1、member2…] 删除set中指定的成员
127.0.0.1:6379> sadd myset1 a b c c
(integer) 3
127.0.0.1:6379> smembers myset1
1) "a"
2) "c"
3) "b"
127.0.0.1:6379> srem myset1 b
(integer) 1
127.0.0.1:6379> smembers myset1
1) "a"
2) "c"
有序结合类型ZSet (sortedSet)

跳转到目录 在redis中,可以保证不重复的元素,仍然可以进行排序。 每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

  • 特点: 可排序的set集合 排序 不可重复 , 相当于Java中的treeset

  • ZSET 官方 可排序SET sortSet

1.内存模型

在这里插入图片描述

2.常用命令 命令说明zadd添加一个有序集合元素zcard返回集合的元素个数zrange 升序 zrevrange 降序返回一个范围内的元素zrangebyscore按照分数查找一个范围内的元素zrank返回排名zrevrank倒序排名zscore显示某一个元素的分数zrem移除某一个元素zincrby给某个特定元素加分 (做排行榜)
  • zadd key values[value1、value2…] 向set中添加成员
  • zrange key start end [withscores] 通过索引区间返回有序集合成指定区间内的成员
  • zrem key value 移除set中的成员
127.0.0.1:6379> zadd mysort 60 zhangsan 20 lisi 55 wangwu
(integer) 3
127.0.0.1:6379> zrange mysort 0 -1
1) "lisi"
2) "wangwu"
3) "zhangsan"
127.0.0.1:6379> zrevrange mysort 0 -1
1) "zhangsan"
2) "wangwu"
3) "lisi"
127.0.0.1:6379> zrange mysort 0 -1 withscores
1) "lisi"
2) "20"
3) "wangwu"
4) "55"
5) "zhangsan"
6) "60"
Redis的通用命令

跳转到目录

  • keys pattern(格式) 获取所有与pattern匹配的key,返回所有与该key匹配的keys。*表示任意一个或多个字符,?表示任意一个字符

  • exists key 判断该key是否存在,1代表存在,0代表不存在

  • type key 获取指定key的类型。该命令将以字符串的格式返回。 返回的字符串为string、list、set、hash,如果key不存在返回none

  • expire key time(时间) 设置key的存活时间

127.0.0.1:6379> keys *
1) "categoryList"
2) "user1"
3) "mylist1"
4) "mysort"
5) "list_325"
6) "myset1"
7) "num"
8) "category_325"
9) "test"
127.0.0.1:6379> exists num
(integer) 1
127.0.0.1:6379> exists num1
(integer) 0
127.0.0.1:6379> set code 543211
OK
127.0.0.1:6379> expire code 3
(integer) 1
127.0.0.1:6379> get code
"543211"
127.0.0.1:6379> get code
(nil)
127.0.0.1:6379> type num
string
127.0.0.1:6379> type mysort
zset
127.0.0.1:6379> keys my????
1) "mysort"
2) "myset1"
127.0.0.1:6379>    
Redis三种特殊数据类型 1、Hyperloglog

什么是基数?

A {1,3,5,7,8,7} B{1,3,5,7,8}

基数(不重复的元素) = 5,可以接受误差!

  • Redis 2.8.9 版本就更新了 Hyperloglog 数据结构!
  • Redis Hyperloglog 基数统计的算法!

在这里插入图片描述

2、Bitmap
  • 位存储

  • 统计用户信息,活跃,不活跃登录 、 未登录打卡,365打卡! 两个状态的,都可以使用Bitmap!

  • Bitmap 位图,数据结构! 都是操作二进制位来进行记录,就只有01 两个状态!365 天 = 365 bit 1字节 = 8bit 46 个字节左右!

在这里插入图片描述

3、Geospatial 地理位置

朋友的定位,附近的人,打车距离计算?

Redis 的 Geo 在Redis3.2 版本就推出了! 这个功能可以推算地理位置的信息,两地之间的距离,方圆几里的人!

可以查询一些测试数据:http://www.jsons.cn/lngcodeinfo/0706D99C19A781A3/ 只有 六个命令 在这里插入图片描述

关注
打赏
1661428283
查看更多评论
立即登录/注册

微信扫码登录

0.0392s