目录
nosql
NoSQL:即 Not-Only SQL( 泛指非关系型的数据库),作为关系型数据库的补充。
作用:应对基于海量用户和海量数据前提下的数据处理问题。
特征
- 可扩容,可伸缩
- 大数据量下高性能
- 灵活的数据模型
- 高可用
常见 Nosql 数据库
- Redis
- memcache
- HBase
- MongoDB
redis简介
REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。
Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。
Redis特征
1.数据间没有必然的关联关系。
2.内部采用单线程机制进行工作。
3.高性能。
4.多数据类型支持 String,list, hash, set, sorted_set
5.持久化支持,可以进行数据灾难恢复
Redis应用
- 为热点数据加速查询(主要场景),如热点商品,热点新闻,热点资讯
- 任务队列,秒杀,抢购,购票排队
- 即时信息查询,如各种排行帮,网站访问统计,公交到站信息,在线人数信息,设备信号等
- 时效信息控制,如验证码控制,投票控制
- 分布式数据共享,分布式集群架构中session分离
- 消息队列
- 分布式锁
Redis基本操作
功能性命令
信息添加
-- 信息添加
--设置Key,value 数据
set key value
--查询命令 如果空值 查询出 nil值
get nkey
-- 帮助信息查询
help get
-- 退出执行
quit
exit
<esc>
redis基本数据类型
- string String
- hash HashMap
- list LinkedList
- set HashSet
- sorted_set TreeSet
String类型
--添加修改数据
set key value
--获取数据
get key
--删除数据
del key
--添加多个数据
mset key1 value1 key2 value2 key
--获取多个数据
mget key1 key2
--获取数据字符个数
strlen key
--追加信息,有就追加,没有就新建
append key value
--键key不存在时将key的值设置为value 若存在则不变
setnx key value
--增长指令,只有当value为数字时才能增长
incr key
incrby key increment
incrbyfloat key increment
--减少指令,有当value为数字时才能减少
decr key
decrby key increment
--设置时间 为values秒过期
setex key seconds value
--设置时间 为values毫秒过期
psetex key milliseconds value
Hash类型
Redis Hash 是一个键值对(field-value)的集合,本质上是“String类型的扩展”。它允许你将多个关联的field-value存储在一个键(key)下,就像一个“迷你数据库表”——key是表名,field是字段名,value是字段值
--添加数据
hset key field value
--获取数据
hget key field
-- 获取hash所有信息(key + value)
hgetall key
--删除数据
hdel key field
--添加多个
hmset key field1 value1 field2 value2
--获取多个
hmget key field1 field2
--获取哈希表中字段的数量
hlen key
--获取哈希表中是否存在指定的字段
hexists key field
--获取哈希表中所有的字段名或字段值
hkeys key
hvals key
--设置指定字段的数值数据增加指定范围的值
hincrby key field increment
hincrbyfloat key field increment
--指定字段如果不存在,就增加,存在就不变,
hsetnx key field value
hash类型数据操作注意事项
-
hash类型下的value只能存储字符串,不允许存储其他类型数据,不存在嵌套现象。如果数据未获取到,对应的值为(nil)
-
每个hash可以存储232-1个键值对
-
hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初中不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
-
hgetall操作可以获取全部属性,如果内部field过多,遍历整体数据效率就会很低,有可能成为数据访问瓶颈
List类型
--添加修改数据 左添加,右添加
lpush key value1 [value2]
rpush key value1 [value2]
--获取数据
lrange key start stop
lindex key index
llen key
--获取并移除数据
lpop key
rpop key
-- 规定时间获取并移除数据 在timeout 时间内取数据,有数据就取无数据就等待,
blpop key1 [key2] timeout
brpop key1 [key2] timeout
Set类型
存储需求:存储大量数据,再查询方面提供更高的效率
需要的结构:能保存大量的数据结构,高效的内部的存储机制,便与查询。
set类型:与hash存储结构完全相同,仅存储键,不存储值,
--添加数据
sadd key member1 [member2]
--获取全部数据
smembers key
--删除数据
srem key member1 [member2]
--获取集合数据总量
scard key
--判断集合中是否包含指定数据
sismember key member
--随机获取集合中指定数量的数据
srandmember key [count]
--随机获取集合中的某个数据并将该数据移出集合
spop key
--求两个集合的交、并、差集
sinter key1 [key2]
sunion key1 [key2]
sdiff key1 [key2]
--求两个集合的交并差集并存储到指定集合中
sinterstore destination key1 [key2]
sunionstore destination key1 [key2]
sdiffstore destination key1 [key2]
--将指定数据从原始集合移动到目标集合中
smove source destination member
sorted_set类型
--添加数据
zadd key score1 member1 [score2 member2]
--获取全部数据
zrange key start stop [withscores]
zrevrange key start stop [withscores]
--删除数据
zrem key member [member ...]
--按照条件获取数据
zrangebyscore key min max [withscores] [limit]
zrevrangebyscore key max min [withscores]
--条件删除数据
zremrangebyrank key start stop
zremrangebyscore key min max
--获取集合数据总量
zcard key
zcount key min max
--集合交、并操作
zinterstore destination numkeys key [key ]
zunionstore destination numkeys key [key]
--获取数据对应的索引
zrank key member
zrevrank key member
--score值获取与修改
zscore key member
zincrby key increment member
redis高级数据类型
Bitmaps
核心思想:用bit位来记录数据,如一个电影的id是5,且被浏览过 则在第5位置为1。
--设置指定key对应偏移量上的bit值,value只能是1或0
setbit key offset value
--获取指定key对应偏移量上的bit值
getbit key offset
--统计两天内有多少个电影被点击过(and:交 or:并 not:非 xor:异或 destKey:结果key)
bitop op destKey key1 [key2...]
--统计指定key中1的数量
bitcount key [start end]
HyperLogLog
统计基数:数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数
--添加指定元素到 HyperLogLog 中
PFADD key element [element ...]
--返回给定 HyperLogLog 的基数估算值
PFCOUNT key [key ...]
--将多个 HyperLogLog 合并为一个 HyperLogLog
PFMERGE destkey sourcekey [sourcekey ...]
GEO
--geoadd:添加地理位置的坐标。
GEOADD key longitude latitude member [longitude latitude member ...]
--geopos:获取地理位置的坐标。
GEOPOS key member [member ...]
--geodist:计算两个位置之间的距离。
GEODIST key member1 member2 [m|km|ft|mi]
--georadius:以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
--georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
--geohash:返回一个或多个位置对象的 geohash 值。
GEOHASH key member [member ...]
Key通用操作
-- 删除指定key
del key
-- 获取key是否存在
exists key
-- 获取key的类型
type key
-- 为指定key设置有效期
expire key seconds
pexpire key milliseconds
expireat key timestamp
pexpireat key milliseconds-timestamp
-- 获取key的有效时间
ttl key
pttl key
-- 切换key从时效性转换为永久性
persist key
-- 查询key
keys pattern
-- 查询模式规则
keys * 查询所有
keys it* 查询所有以it开头
keys *heima 查询所有以heima结尾
keys ??heima 查询所有前面两个字符任意,后面以heima结尾
keys user:? 查询所有以user:开头,最后一个字符任意
keys u[st]er:1 查询所有以u开头,以er:1结尾,中间包含一个字母,s或t
-- 为key改名
rename key newkey
renamenx key newkey
--对所有key排序,再list,set,zset中。
sort
--其他key的通用操作,可以使用tab键进行切换
help @generic
数据库操作
--切换数据库 0-15
select index
--其他操作
quit
ping
echo massage
--移动数据,必须保证目的数据库没有该数据
move key db
--查看库中数据总量
dbsize
--库中元素数量
dbsize
--清除库中的所有元素
flushdb
--清除redis所有库中的所有元素
flushall