NoSQL
Not only SQL,泛指非关系型数据库
实际业务中:NoSQL+RDBMS(e.g.阿里架构引进)
NoSQL数据库的四大分类:
- KV键值对:Redis
- 文档型数据库:MongoDB
- 列存储数据库:HBase
- 图形数据库:Neo4j
Redis
Remote Dictionary Server,远程字典服务,也被称之为结构化数据库
有16个数据库,默认使用第0个
清除所有数据:flushall
切换数据库:select 2
查看当前数据库的key数量:dbsize
Redis特点:
- 数据类型丰富
- 支持持久化
- 集群
- 事务
Redis单线程:
- Redis是基于内存操作,CPU不是Redis性能瓶颈
Redis为什么单线程还这么快:
- 误区:高性能的服务器一定是多线程的
- Redis是将所有数据放在内存中,内存的读写速度非常快
Redis五大数据类型
Redis-Key
String
90%的请求都是String类型
- append:在字符串后追加
- setex:设置带过期时间的key-value
- setnx:设置key-value,只有key不存在时才设置
- mset:设置多个key-value
- msetnx:设置多个key-value,只有key不存在时才设置
- getrange:获取字符串指定下标范围的值
- setrange:设置字符串指定下标范围的值
List
可栈、队列、阻塞队列
- lpush、rpush、lpop、rpop:元素的插入和删除
- lrange:获取指定下标范围的元素
- lindex:下标获取元素
- llen:列表总长度
Set
不可重复的集合
- sadd:添加元素
- smembers:获取所有元素
- sismember:判断元素是否存在
- scard:获取集合中元素个数
- srem:删除指定元素
- srandmember:从集合中随机获取元素
Hash
Map集合,key-map。适合用于存储经常改变的对象
- hset:设置key-map
- hmset:设置多个key-map
- hget:获取key-map
- hgetall:获取所有key-value
- hkeys:获取所有key
- hvals:获取所有value
- hdel:删除key-map
- hlen:获取key-map长度
ZSet
有序的set集合(sorted set)
每个元素都会关联一个double类型的分数,通过分数进行排序
- zadd:添加元素
- zrange:获取指定下标范围的元素
- zrangebyscore:根据分数获取元素
- zrem:删除指定元素
- zcount:获取指定分数范围的元素数量
Redis三种特殊数据类型
Geospatial
地理位置,存储经纬度
底层是Zset,可以用Zset的命令操作Geo
- geoadd:添加地理位置,纬度_经度_名称
- geopos:获取地理位置
- geodist:计算两个位置之间的距离
- geohash:将地理位置转换为hash值
- georadius:指定经纬度为中心,某一半径内的元素
- georadiusbymember:指定元素为中心,某一半径内的元素
HyperLogLog
基数统计,允许容错
不存储数据,只存储数据的数量
- pfadd:添加元素
- pfcount:获取元素数量
- pfmerge:合并两个HyperLogLog
BitMap
位图,只有0和1两个状态
- setbit:设置某key的值
- getbit:获取某key的值
- bitcount:统计定范围value为1的个数
事务
一组Redis命令的集合,不保证原子性(Redis命令保持原子性)
开启事务:
multi //开启事务
... //命令入队
exec //执行事务
放弃事务:
discard //放弃事务
watch监控:
- 悲观锁:认为一定会出问题,上锁
- 乐观锁:认为不会出问题,不上锁。更新时判断是否有人修改
Jedis
Redis官方推荐的java连接开发工具,使用Java操作Redis中间件