NoSQL概述
为什么需要NoSQL
- 高并发读写
- 海量数据的高效率存储和访问
- 高可扩展性和高可用性
NoSQL数据库分类
- 键值存储。Redis
- 列存储。HBase
- 文档数据库。MongoDB
- 图形数据库。
NoSQL特点
- 易扩展
- 大数据量,高性能
- 灵活的数据模型
- 高可用
Redis概述
支持的键值数据类型
- 字符串(String)
- 散列(hash)
- 列表(list)
- 集合(set)
- 有序字符串集合(sorted set)
Key
- 不要过长
- 不要过短
- 统一的命名规范
存储String
- 底层是二进制存储的。二进制安全,存入和获取的数据相同
- Value最大512MB
命令
- 赋值
set
- 取值
get
- 删除
del
- 数值增减
incr
,decr
,incrby(+数字)
,decrby(++数字)
- 扩展命令
append(返回的事字符串长度)
存储Hash
- 赋值
hset myhash username jack
hmset myhash2 username rose age 21
- 取值
hget myhash username
hmget myhash username age
hgetall myhash
- 删除
hdel myhash2 username age
- 增加数字
hincrby myhash age 5
- 存在
hexists myhash username
- 得到key,value,和长度
hlen myhash
hkeys myhash
hvals myhash
存储list
- ArrayList数组存储
- LinkedList双向链表存储
- 双向链表增加删除数据
- 常用命令:
- 两端添加
lpush mylist a b c
rpush mylist a b c
- 两端弹出
-
lpop mylist
头部弹出 -
rpop mylist
尾部弹出
-
- 查看列表
-
lrange mylist 0 5
看0到5的元素,可为负数表示从右边数起
-
- 获取列表元素个数
llen mylist
- 移除
-
lrem mylist 2 3
从头到尾,删除2个3 -
lrem mylist -2 1
从后到前,删除2个1
-
- 设置
-
lset mylist 3 mmm
相当于list[3]=mmm
-
- 扩展命令
-
lpushx mylist3 a
x表示不存在不插入 -
linsert mylist before b 11
在b前插入11 -
rpoplpush mylist5 mylist6
从5右边弹出押入6左边
-
- 两端添加
- 场景:
- 生产者消费者,队列
存储Set
sadd myset a b c
srem myset a b
smembers myset
sismember myset a
sdiff mya1 myb1
sinter mya2 myb2
sunion mya3 myb3
-
scard myset
集合内数量 srandmember myset
-
sdiffstore my1 mya1 myb1
把mya1和myb1差集存入mya1,类似的sunionstore
、sinterstore
- 场景:
- 追踪唯一性的
- 维护数据对象之间的关联
存储Sorted-Set
有序的集合
-
zadd mysort 70 a 80 b 90 c
分数+实际元素,元素存在的话则用新的分数替代原来的分数 -
zscore mysort a
获取分数 -
zcard mysort
长度 zrange mysort 0 -1
zreverange
zremrangebyrank mysort 0 4
zremrangebyscore mysort 80 100
zadd mysort
zrangebyscore mysore 0 100 withscores limit 0 2
zincrby mysort 3 ls
- 场景:
- 大型在线游戏积分排行榜
- 检索索引数据
通用操作
- 查看key
keys *
kyes my?
exists
get
rename company newcompany
-
expire newcompany 1000
过期时间 ttl newcompany
type newcompany
type mylist
应用场景
- 缓存
- 任务队列
- 网站访问统计
- 数据过期处理
- 应用排行榜
- 分布式集群架构中的session分离
客户端
Java语言用Jedis
事务
-
multi
开启事务,discard
回滚,exec
提交。 - 事务串行,不会做其他事,保证严格原子性。失败后面会继续执行。
持久化
- RDB按时间间隔持久化到硬盘
- AOF按日志的记录操作
- 无持久化
关于我:
linxinzhe,全栈工程师,目前供职于某世界500强银行的金融科技部门(人工智能,区块链)。
GitHub:https://github.com/linxinzhe
欢迎留言讨论,也欢迎关注我~
我也会关注你的哦!