Redis(二)Redis基础


什么是Redis

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库

Redis能做什么

  1. 用于内存存储,持久化
  2. 效率高
  3. 计数器
  4. ........

特性

  1. 多样的数据类型
  2. 持久化
  3. 集群
  4. 事务

基础知识

Redis默认使用16个数据库

Redis 常用命令

select index  切换数据库
DBSIZE 查看数据库大小
get key 获取对应key
keys * 获取所有key
flushdb 清除当前数据库
flushAll 清除所有数据库

Redis是单线程的

Redis是基于内存操作,是C语言编写的,CPU不是Redis的性能瓶颈,Redis的瓶颈是根据机器的内存和网络宽带,既然可以用单线程就用单线程了。


Redis为什么这么快?

高性能的服务器不一定是多线程的,多线程不一定会比单线程的效率高,Redis是将所有的数据放在内存去操作,所以效率是很高。另外,多线程会涉及CPU的上下文切换,这是一个耗时操作。对于内部系统来说,没有上下文切换效率才是最高的。

数据类型

引用官方文档:


Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库缓存消息中间件MQ。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, Bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

字符串(strings)

 String类似使用场景:

  • 计数器
  • 统计多单位数量
  • 粉丝数
  • 对象缓存存储
set key value 设置名称为value的key
exists key 判断这个key是否存在,存在返回1,否则返回0
expire key seconds 为指定key设置过期时间
ttl key 查看key剩余的过期时间
type key 查看key类型
append key value 向指定key值追加value 返回value的总长度,如果指定key不存在,就相当于set key
strlen key 获取指定key的长度
incr key 将指定key值加一
decr key 将指定key值减一
incrby key num 将指定key值加num,指定增量
decrby key num 将指定key值减num,指定减量
getrange key start end 截取字符串,end取-1获取截取全部字符
setrange key offset value 替换指定位置字符串
setex(set with expire) key seconds value 设置过期时间
setnx(set if not expire) key value 不存在再设置,即:当设置key时,如果该key不存在,则返回1,设置成功,否则如果该key存在,不会覆盖key,返回0,设置失败,分布式锁常用
mset key value [key value...] 批量设置多个key 
mget key value [key value...] 批量获取多个value
msetnx key value [key value...] 批量设置多个不存在的key,这个操作为原子性操作
mset object:id:filed 保存对象,例如mset user:1:name zhangsan user:1:age 20
getset 先获取值再去替换,如果值不存在返回nil,存在则替换

散列(hashes)

Map集合,key-Map

hash变更的数据 user name age 这些尤其是用户信息之类的,经常变动的信息更适合用hash去存储

hset key field value 向集合中添加元素
hget key field 获取单个元素
hmset key field value[key value...] 批量添加元素
hmget key field [field...] 批量获取元素
hgetall key 获取所有元素
hdel key field [field...] 删除指定元素
hlen key 获取hash长度
hexists key field 判断元素是否存在
hkeys key 获取所有key
hvals value 获取所有值
hincrby key field increment 将指定整数型key值增减
hsetnx key field value 如果key不存在则替换对应的值,如果存在则不能替换

列表(lists)

list是一个可重复的有序集合,可用作栈、队列、阻塞队列

  • 实际上是一个链表,前后都可以插入值
  • 如果key不存在插入时需要创建新的链表
  • 如果key存在,就可以添加元素
  • 如果移除了所有的value,即空链表,也代表不存在
  • 在两边插入或修改值效率最高,中间元素相当于较低
lpush key value [value...] 向list集合头部中添加元素
lrange key start stop 获取指定元素,stop取-1取全部元素
rpush key value [value...] 向list集合尾部中添加元素
lpop 删除左边元素
rpop 删除右边元素
lindex key index 获取指定下标元素
llen key 获取列表长度
lrem key count value 删除列表的值,count指定删除数量
ltrim key start stop 截取列表元素
rpoplpush source destination 删除最后一个元素并将其移动到新的列表中
exist key 判断key是否存在
lset key index value 将列表指定下标的值替换为另一个值,相当于更新操作,但需要保证该key存在,不存在会报错
linsert key before|after pivot value 向列表的指定元素前面或后面添加元素

集合(sets)

set是一个无序不重复的集合

sadd key member [member...] 向列表添加元素
smembers key 获取列表所有元素
sismember key member 列表是否包含指定元素
scard key 列表长度
srem key member [member...] 删除set元素
srandmember key [count] 随机抽取元素,count为元素个数
spop key [count] 随机删除元素,count为元素个数
smove source destination member 移动元素到另一个集合
sdiff key [key...] 取集合差集
sinter key [key...]取集合交集
sunion key [key...]取集合并集

有序集合(sorted sets)

 在set的基础上增加了排序

zadd key score member[score member...] 添加元素
zrange key start stop 查看指定位置key
zrangebyscore key min max [withscore] [limit offset count] 按照指定key规则升序排序,min可以取-inf相当于-∞,max可以取+inf,相当于+∞
zrem key member [member...] 删除元素
zcard key 查看元素长度
zrevrange key start stop [withscore] 从大到小排序
zcount key min max 查询指定区间的元素数量

 案例思路:(取top n)

  • set排序,可以存储班级成绩表、工资表等进行排序,也可以指定区间或者指定范围排序!
  • 普通消息:1  重要消息:2,带着权重去判断!
  • 微博、B站排行榜应用,利用zset按照指定顺序升序排序
  • 淘宝、京东按照价格排序、按照距离排序、按照评论排序!

 三种特殊数据类型

geospatial 地理空间

 朋友的定位、附近的人、打车距离,可以通过Redis的Geo实现,它可以推算地理位置信息,两地之间的距离等。

GEOADD key longitude[-180~180] latitude[-85.05112878~85.05112878] member [longitude latitude member ...] 

将指定的地理空间位置(纬度、经度、名称)添加到指定的key

GEOPOS key member [member ...] 从key里返回所有给定位置元素的位置(经度和纬度)

GEODIST key member1 member2 [unit] 返回两个给定位置之间的距离 unit指定距离单位(m、km、mi英里、ft英尺)

GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素

GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点指定成员的位置被用作查询的中心

 hyperloglogs 统计基数的算法

 优点:占的内存固定,2^64不同元素的技术,只需要占用12KB的内存,但有0.81%的容错率,如果用作统计UV任务,完全可以忽略不计

PFadd key element [element...] 添加元素
PFcount key [key...] 查看元素数量
PFMERGE destkey sourcekey [sourcekey...] 取两个key的并集

  Bitmap 位存储

 Bitmap位图,是一种数据结构,通过操作二进制来进行记录,就只有0和1两种状态,可用于统计用户信息、活跃、不活跃、登录、未登录、打卡、365天打卡记录等。

setbit key offset value 添加元素
getbit key offset 查看元素值
bitcount key [start end] 统计某一个区间符合条件的数量

使用Bitmap记录从周一到周五的打卡记录