NOSQL概述
对比传统关系型数据库,优势有三
1.NOSQL支持更高的并发量,关系型数据库每秒读写瓶颈仅有万次
2.NOSQL支持海量数据的高效率存储和访问,从上亿条数据中查找也很快
3.高可扩展性和高可用性
4.灵活的数据模型
NOSQL的四大存储类型
Redis应用场景
缓存,秒杀,任务队列,排行榜,网站访问统计,数据过期处理,分布式集群架构中的session分离
Redis存储容器
String Hash List Set SortedSet
基础语法
通用操作
代码 | 解释 |
---|
keys * | 取得所有键 |
exists name | 判断键是否存在 |
del name | 根据键删除键值对 |
rename name newname | 重命名键名 |
expire name 1000 | 设置键值对过期时间,单位是秒 |
ttl name | 查询键值对剩余超时时间 |
type name | 查询指定键数据类型 |
flushall | 清空当前数据库 |
String
键值都为String
代码 | 解释 |
---|
set name klh | 设置键值对 |
get name | 根据键取出值 |
getset name wyx | 先取出值再设置新值 |
del name | 根据键删除键值对 |
incr num,decr num | 根据键将可以转化为整型的字符串±1,若不能转,则报错,若没有这个键值对,则默认值为0 |
incrby num1 5,decrby num1 5 | 指定±步长 |
append name xzz | 根据键将新值追加到旧值上,可以作用于整型,也追加而不是增长 |
Hash
键为String,值为map,以下为方便描述称前者为Hash键,后者键为map键
代码 | 解释 |
---|
hset myhash username klh | 为Hash键为myhash的map设置map键为username,值为klh的键值对 |
hget myhash username | 根据hash键和map键获取值 |
hmset myhash username klh password 123 | 指定hash键设置多个map键值对 |
hmget myhash username password | 指定hash键根据多个map键获取多个值 |
hgetall myhash | 指定hash键,获取所有map键值对 |
hdel myhash username password | 指定hash键,删除多个map键的值 |
del | 删除指定hash |
hincrby myhash password 5 | 指定hash键,map键,自定义步长增长 |
hexists myhash username | 指定hash键,判断map键是否存在 |
hkeys myhash | 指定hash键,取得所有map键 |
hvals myhash | 指定hash键,取得所有map值 |
hlen myhash | 指定hash键,取得map长度 |
List
首尾操作 左侧为首,右侧为尾
代码 | 解释 |
---|
lpush mylist a b c | 指定键为mylist,从左侧依次插入a b c ,插入完数据为cba |
rpush mylist 123 | 指定键为mylist,从左侧依次插入1 2 3,插入完数据为123 |
lrange mylist 0 -1 | 根据键查询,范围为索引0到-1,-1表示最后一位,-2表示倒数第二位,正数表示索引为几 |
lpop mylist | 从左侧弹出一个元素 |
rpop mylist | 从右侧弹出一个元素 |
llen mylist | 查询键为mylist的长度 |
扩展 | |
lpushx/rpushx mylist q | 仅当键名为mylist的list已经存在的时候才插入 |
lrem mylist 2(count) 3(value) | 删除count个值为value的元素, |
` | count=0删除全部,count<0,从左侧开始删除,count>0,右侧开始删除 |
lset mylist 3(索引) mmm | 将指定索引的位置替换为新值 |
linsert mylist before/after b d | 在左数第一个b之前(之后)插入d |
rpoplpush mylist1 mylist2 | 将mylist1右侧第一个元素弹出压入mylist2左侧 |
Set
使用场景:1.存储唯一性数据 2.使用差集交集并集操作,维护数据对象之间的关联关系,
代码 | 解释 |
---|
sadd myset a | 插入数据 |
srem myset a b | 根据元素值移除数据,可移除多个 |
smembers myset | 查看所有元素值 |
sismember myset a | 查询是否包含某元素值 |
sdiff myset1 myset2 | 求两个set的差集,以第一个set为准 |
sinter myset1 myset2 | 求交集 |
sunion myset1 myset2 | 求并集 |
扩展 | |
scard myset | 查询元素个数 |
srandmember myset | 随机返回元素 |
sdiffstore,sinterstore,sunionstore myset myset1 newset | 求差交并集并存入新set |
SortedSet
每一个元素都有一个分数与之关联,并且分数可重复,根据分数排序.
代码 | 解释 |
---|
zadd mysort 70 zhang 80 li | 插入分数和元素(分数在前,元素在后) |
zscore mysort zhang | 根据元素查询分数 |
zcard mysort | 查询元素个数 |
zrem mysort zhang li | 根据元素值删除元素 |
zrange mysort 0 -1 (withscores) | 查询mysort中所有元素(附带分数),默认分数从小到大 |
zrevrange mysort 0 -1 (withscores) | 查询mysort中所有元素(附带分数)按分数从大到小 |
zremrangebyrank mysort 0 4 | 按排名范围删除 从零开始删除四个 |
zremrangebyscore mysort 80 100 | 按分数范围删除 从80到100 |
扩展 | |
zrangebyscore mysort 70 100 (withscores limit 0 2) | 查询指定分数范围的元素 |
zincrby mysort 3 zhang | 根据元素值为元素增加指定步长的分数 |
zcount mysort 80 100 | 根据指定分数范围查询元素个数 |
Redis的特性
1.多数据库
Redis中包含16个数据库,编号从0到15,默认使用0号数据库,通过select 1来选择使用1号数据库,
通过使用move mysort 2来将当前数据库的键为mysort的键值对移动到2号数据库.
2.支持事务
multi开启事务 exec提交 discard回滚
Redis的持久化策略
策略名 | 优势 | 劣势 |
---|
RDB,定时将数据集快照持久化到硬盘上 | 1.只包含一个文件,备份拷贝都很方便 | 1.无法完全保证数据不丢失 |
` | 2.占用系统资源少,不用实时记录 | 2.子进程定时持久化时,可能会导致Redis停止工作几百毫秒 |
` | 3.数据量大的话,重启效率比AOF更高 | |
AOF,以日志形式记录每一条执行过的命令 | 1.可以保证数据不丢失 | 日志文件比RDB的文件大 |
` | redis -check -aof检查数据一致性 | 效率低于RDB |
` | 如果日志过大,redis自动启动重写机制 | |
无持久化 | 仅用作缓存 | |
同时采用RDB与AOF | | |