Redis学习笔记--基础知识
NoSQL数据库简介
一、NOSQL的作用
减少CPU、IO的压力,直接通过内存进行读取。
可以直接作为缓存使用,提高访问速度,减少IO的读操作。
二、NOSQL概述
NOSQL泛指非关系型数据库,不易跨业务逻辑方式存储,以简单的key-value模式存储,因此大大的增加了数据库的扩展能力。
特点:不遵循SQL标准;不支持ACID;远超于SQL性能;
三、NOSQL适用场景
对数据高并发读写;
海量书读写;
对数据高可扩展性的;
四、NOSQL不适用场景
需要事务的支持;
基于sql的结构化查询存储,处理复杂的关系,需要即席查询
五、常见的NOSQL数据库
Memcache:不持久化,支持类型单一
Redis:支持持久化,支持多种数据结构的存储,一般作为缓存数据库库辅助持久化的数据库
MongoDB:文档型数据库,支持二进制数据及大型数据
Redis简介
一、Redis概述
Redis是一个开源的key-value存储系统
和Memcached类似,它支持存储的value类型相对更多,包括String、list、set、zset、hash
这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的
在此基础上,Redis支持各种不同方式的排序
与memcached一样,为了保证效率,数据都是缓存在内存中
区别是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件
并且在此基础上实现了master-slave(主从)同步
与Memcache三点不同:支持多数据类型、支持持久化、单线程+多路IO复用
二、应用场景
配合关系型数据库做高速缓存
多样的数据结构存储持久化数据
最新N个数据 ---------》 通过list实现按自然时间排序的数据
排行榜,Top N ---------》利用zset (有序集合)
时效性的数据(验证码) ----------》Expire过期
计数器、秒杀 ---------》 原子性,自增方法INCR、DECR
去除大量数据中重复的数据 ----------》利用set集合
构建队列 --------》 利用list集合
发布订阅消息系统 -------》pub/sub模式
Redis常用数据类型
一、键(key)
keys * :查看当前库中所有key
exists key:判断某个key是否存在
type key:查看你的key是什么类型
del key:删除指定key数据
unlink key:根据value选择非阻塞删除
expire key 10:为给定的key设置过期时间
ttl key:查看还有多有秒过期
select: 命令切换数据库
dbsize:查看当前数据库的key的数量
flushdb:清空当前库
flushall:通杀全部库
二、字符串(String)
String类型是二进制安全的,一个Redis中的字符串最多可以是512M
常用命令:
set key value:添加键值对
get key:查询对应key值
append key value:将给指定的value追加到原值得末尾
strlen key:获取值的长度
setnx key value:只有在key不存在时 设置key的值
incr key:将key中存储的数字值增1
dect key:将key中存储数字减1
inceby/dectby key 步长:将key中储存的数字值增减,自定义步长
mset key1 value1 key2 value2 key3 value3....:同时设置一个或多个key-value对
mget key1 key2 key3:同时获取一个或多个value值
msetnx key1 value1 key2 value2 key3 value3....:同时设置一个或多个key-value对,当且仅当所有给定key都不存在
原子性,有一个失败则都失败
getrange key 起始位置 结束位置:获取值得范围,类似java中subString,前包,后包
setex key 过期时间 value:设置键值的同时,设置过期时间,单位秒
getset key value:以新换旧,设置了新值同时获得旧值
三、列表(List)
单键多值
Redis列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部(左边)或者尾部(右边)。
lpush/rpush key value1 value2 value3 ...:从左右/右边插入一个或多个值
lpop/rpop:从左边/右边吐出一个值(值在键在,值光键亡)
lrange key start stop:按照索引下标获得元素(从左到右)
lrange key 0 -1 表示获取所有
lindex key index:按照索引下标获得元素(从左到右)
linset key before value newvalue:在value的后面插入newvalue插入值
llen key:获取列表长度
四、集合(set)
与list类似,特殊之处在于set是可以自动排重的
sinter key1 key2:返回两个集合的交集元素
sunion key1 key2:返回两个集合的并集元素
sdiff key1 key2:返回两个集合的差集元素
五、哈希(Hash)
键值对集合,类似于Java中的Map<String ,Object>
hset key field value:给key集合中的field键赋值value
hget key field:从key集合field取出value
hmset key field1 value1 field2 value2....:批量设置hash值
hkeys key:列出hash集合的所有field
hvaks key:列出该hash集合的所有value
hincrby key field increment:为哈希表key中的域field的值加上增量1 -1
六、有序集合(Zset)
Zset有序集合与普通集合set非常相似,是一个没有重复元素的字符串集合
有序集合每个成员都关联一个评分(score),这个评分被用来按照从最低分到最高分的方式排序集合中的成员,集合的成员是唯一的,但是评分可以是重复的
zadd key scorel1 value1 scorel2 value2....:将一个或多个member元素及score值接入到有序集合key当中
zrang key start stop WITHSCORES:返回有序集key中,下标在 start stop 之间的元素,带WITHSCORES,可以让分数和值返回带结果集
zincrby key increment value:为元素的score加上增量
zrank key value 返回该值在集合中的排名,从0开始
zcount key min max:统计该集合,分数区分内的元素个数
zrank key value:返回该值在集合中的排名,从0开始
Redis的发布和订阅
Redis发布订阅(pub/sub)是一种消息通讯模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis客户端可以订阅任意数量的频道。
指令
打开一个客户端订阅channel1:SUBSCRIBE channel1
打开另一个客户端,给channel1 发布消息hello:publish channel1 hello(返回的1是订阅者数量)
Redis新数据类型
一、Bitmaps
概念
Redis提供了Bitmaps这个数据类型可以实现对位的操作:
Bitmaps本身不是一种数据类型,实际上它就是字符串(key-value),但是它可以对字符串的位进行操作
Bitmaps单独提供了一套命令,所以在Redis中使用Bitmaps和使用字符串的方法不太相同。可以把Bitmaps想象成一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标在Bitmaps中叫做偏移量。
使用
例:记录每个用户是否访问过网站,假设20个用户,id为1.6.11的用户对用户进行了访问
setbit key offset value:设置Bitmaps中某个偏移量的值(0或1)
setbit user 1 1
setbit user 6 1
setbit user 1
gitbit key offset:获取Bitmaps中某个偏移量的值
gitbit user 1
bitcount key start end:统计字符串从start字节到end字节比特值为1的数量
bitcount user
bitop and(or/not/xor) destkey key:复合操作,它可以做多个bitmaps的交集(and)并集(or)非(not)异域(xor)操作并将结果保存在destkey中
Bitmaps与set对比
二、HyperLogLog
简介
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的,并且是很小的。
HyperLogLog只会根据输入元素来计算基数,而不会存储元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。
应用场景
在工作中,我们经常遇到与统计相关的功能需求,比如统计网站pv(PageView页面访问量),可以使用Redis的incr、incrby轻松实现。
但像UV(UniqueVisitor,独立访客)、独立ip数,搜索记录等需要去重和计数的问题,求集合中不重复元素个数的问题成为基数问题。
命令
pfadd key element element :添加指定元素到HyperLoglog中(成功返回1,失败0)
pfadd program "java" "c++"
pfcount key key:计算HLL的近似基数,可以计算多个HLL,比如HLL存储每天的UV,计算一周的UV可以使用7天的UV合并计算即可。
pfcount program "java"
pfmerge destkey sourcekey sourcekey ...:将一个或多个HLL合并后的结果存储在另一个HLL中,比如每月活跃用户可以使用每天活跃用户来合并计算可得
三、 GEO
简介
GEO,Geographic,地理信息的缩写。该类型,就是元素的2维坐标,在地图上就是经纬度。Redis基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬度Hash等常见操作。
命令
geoadd key longitude latitude member:添加地理位置(经度、维度、名称)
geoadd city 121.47 31.23 shanghai
geopos key member:获得指定地区的坐标值
geopos city shanghai
geodlist key member1 member2 m/km/ft/mi:获取两个位置之间的直线距离
geroadius key longitude latitude radius m/km/ft/mi:以给定的经纬度为中心,找出某一半径内的元素