- NOSQL概述
- NOSQL和关系型数据库比较
- NOSQL的优缺点
- 非关系型数据库的优势
- 关系型数据库的优势
- 主流的NOSQL产品
- Redis概述
- Redis的通用命令
- Redis的五种数据类型
- 字符串类型String
- 哈希类型hash
- 有序可重复列表类型list
- 无序不可重复列表类型set
- 有序结合类型sortset
- Redis三种特殊数据类型
跳转到目录
- NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指
非关系型的数据库
。 - 随着互联网
web2.0网站
(动态网站)的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。 - NoSQL数据库的产生就是为了
解决大规模数据集合多重数据种类
带来的挑战,尤其是大数据应用难题。
跳转到目录
跳转到目录
-
优点:
- 成本:
nosql
数据库简单易部署,基本都是开源软件,不需要像使用oracle那样花费大量成本购买使用,相比关系型数据库价格便宜。 - 查询速度:nosql数据库(
Redis
)将数据存储于内存
之中,关系型数据库将数据存储在硬盘
中,自然查询速度远不及nosql数据库。 - 存储数据的格式:nosql的存储格式是
key,value
形式、文档
形式、图片
形式 等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型。 - 扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。
- 成本:
-
缺点:
- 维护的工具和资料有限,因为nosql是属于新的技术,不能和关系型数据库10几年的技术同日而语。
不提供对sql的支持,如果不支持sql这样的工业标准
,将产生一定用户的学习和使用成本。
跳转到目录
-
性能NOSQL(Redis)
是基于键值对
的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。 -
可扩展性同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。
跳转到目录
- 复杂查询可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。
- 事务支持使得对于安全性能很高的数据访问要求得以实现。对于这两类数据库,对方的优势就是自己的弱势,反之亦然。
- 关系型数据库与NoSQL数据库并非对立而是互补的关系,即通常情况下使用关系型数据库,在适合使用NoSQL的时候使用NoSQL数据库,让NoSQL数据库对关系型数据库的不足进行弥补。
- 一般会将数据存储在关系型数据库中,在nosql数据库中备份存储关系型数据库的数据 (一般存储一些关系数据库中的热点数据, 高频不常修改的数据)
跳转到目录
键值(Key-Value)
存储数据库- 相关产品: Tokyo Cabinet/Tyrant、
Redis
、Voldemort、Berkeley DB - 典型应用:
内容缓存,主要用于处理大量数据的高访问负载
。 - 数据模型: 一系列键值对 (string, list, set, hash, zset 五种常用类型)
- 优势: 快速查询
- 劣势: 存储的数据缺少结构化
- 相关产品: Tokyo Cabinet/Tyrant、
列
存储数据库- 相关产品:Cassandra, HBase, Riak
- 典型应用:分布式的文件系统
- 数据模型:以列簇式存储,将同一列数据存在一起
- 优势:查找速度快,可扩展性强,更容易进行分布式扩展
- 劣势:功能相对局限
文档
型数据库- 相关产品:CouchDB、
MongoDB
- 典型应用:Web应用(与Key-Value类似,Value是结构化的)
- 数据模型: 一系列键值对
- 优势:数据结构要求不严格
- 劣势: 查询性能不高,而且缺乏统一的查询语法
- 相关产品:CouchDB、
图形(Graph)
数据库- 相关数据库:Neo4J、InfoGrid、Infinite Graph
- 典型应用:社交网络
- 数据模型:图结构
- 优势:利用图结构相关算法。
- 劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
跳转到目录 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分离
跳转到目录
- 官网下载: 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
# 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
。
key
和value
都是string
类型
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 自减步数
Map
跳转到目录 Redis中的Hash类型
可以看成具有String Key
和String Value
的map容器
。所以该类型非常适合于存储值对象
的信息。如Username、Password和Age等。如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对。
Map
, 也就是说他的value
是一个键值对
特点: value 是一个map
结构 存在key value, key 无序的 , 5种数据类型key都是string
类型的;
- hash类型, key是string类型, value是map类型 ==> 每一个
key
都对应一个Map
-
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
类型;
类似 双端队列
-
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集合
元素无序
不可以重复
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
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 基数统计的算法!
-
位存储
-
统计用户信息,
活跃,不活跃
!登录 、 未登录
!打卡
,365打卡!两个状态
的,都可以使用Bitmap! -
Bitmap 位图,数据结构! 都是操作
二进制位
来进行记录,就只有0
和1
两个状态!365 天 = 365 bit 1字节 = 8bit 46 个字节左右!
朋友的定位,附近的人,打车距离计算?
Redis 的 Geo
在Redis3.2 版本就推出了! 这个功能可以推算地理位置的信息,两地之间的距离,方圆几里的人!
可以查询一些测试数据:http://www.jsons.cn/lngcodeinfo/0706D99C19A781A3/ 只有 六个命令