Redis入门
概述
Redis是什么
Redis(Remote Dictionary Server),远程字典服务
是一个免费、开源的C语言编写的、支持网络、基于内存的可持久化的日志型Key—Value数据库
是当下最热门的NoSQL技术,也称为结构化数据库
Redis能干嘛
1.内存存储,持久化,内存中是断电丢失的,所以持久化是很重要的(RDB,AOF)
2.效率高,用于高速缓存
3.发布订阅系统
4.地图信息分析
5.计数器等(浏览量)
特性
1.支持多种数据类型
2.集群
3.事务
4.支持多种语言接口
5.持久化
基础知识
redis默认有16个数据库,默认的是第0个数据库
select n选择第n个数据库(0-15)
dbsize查看当前数据库大小
keys * 查看所有key
flushdb 清空当前数据库
flushall 清空全部数据库
Redis是单线程的
Redis是很快的,Redis是基于内存操作,CPU不是Redis的性能瓶颈,Redis的瓶颈是机器的内存和网络的带宽,既然可以使用单线程实现,就使用单线程
Redis为什么单线程还这么快
Redis是C语言写的,官网提供的数据为每秒10万+的QPS,完全不比Memecache差
误区1:高性能的服务器都是多线程的
误区2:多线程(CPU上下文会切换)一定比单线程效率高
CPU速度>内存>硬盘
核心 :redis是将所有数据全部放在内存中的,所以单线程操作效率就是最高的,对于内存系统来说,如果没有上下文切换,效率就是最高的!多次读写都是在一个CPU上,在内存情况下,这个就是最佳方案
Redis 五大基本数据类型
Redis-Key
set key value 设置对应的键值
get key 得到key对应的value
exists key 查询是否存在key
move key db 移动对应的key到第db个数据库
expire key time 设置key 的自动过期时间 time秒
ttl key 查询key的剩余存活时间
type key 查看当前key的类型
Redis中文网有详尽的命令
String 字符串类型
append key value 在key的字符串后追加value字符串,如果key不存在,则新建一个key
strlen key 获取key对应value字符串的长度
incr key key对应value+1
decr key key对应value-1
incrby key increment key对应value增长increment步长
decrby key decrement key对应value减少decrement步长
getrange key start end 截取字符串[start end]
setrange key offset value 将偏移量为offset处的值替换为value
setex (set with expire 设置过期时间)
setnx (set if not exist)如果不存在再设置,存在则创建失败
mset 批量设置k-v,空格分隔即可
mget 批量获取
msetnx 如果不存在则创建(原子操作,一个失败则所有都失败)
进阶
set/mset user : 1 {name:zhangsan ,age:3} 设置一个user:1对象,值为Json字符串来保存一个对象
getset 先get再set,返回旧值,设置新值
String类型的使用场景:value可以是字符串也可以是数字
1.计数器
2.统计多单位的数量 uid:851457617:follow 0
3.粉丝数
4.对象缓存存储
List类型
在redis里,List可以用成栈和队列、阻塞队列
lpush 将一个或多个值插入到列表的头部
lrange 从头部范围取值
rpush 将一个或多个值插入到列表的尾部
lpop 移除列表头部元素
rpop 移除列表尾部元素
lindex 通过下标获取list中的值
llen 返回列表的长度
lrem 移除指定的一个或多个key
ltrim 通过下标截取指定的长度
rpoplpush source des 移除列表的最后一个元素,并加入新的列表
lset 将列表中指定下标的值替换为另外的值
linsert 将某个具体的value插入到列表中某个元素的前面或者后面
小结
list实际上是个链表,before after left right都可以插入值
如果key不存在,创建新的链表
key存在,新增内容
如果移除所有元素,则链表不存在
在两端操作效率最高,中间元素相对来说效率会低一点
消息排队!消息队列 Lpush Rpop
! 栈 Lpush Lpop
Set类型
set中的key是不重复、无序的
sadd 向集合中添加元素
smembers 查看所有元素
sismember 判断是否是集合的元素
scard 获取set集合中的元素个数
srem 移除对应元素
srandmember 随机抽出指定个数的元素 默认1
spop 随机删除指定个数的元素 默认1
smove 将一个指定的值,从一个集合移动到另一个set
案例
微博、B站的共同关注(交集)
数字集合类:
差集 :sdiff
交集 :sinter 共同好友可以如此实现
并集 :sunion
Hash
Map集合,key-Map集合,本质和String类没有太大区别
hset 添加一个具体的key-value
hget 获取对应集合对应字段的字
hmset 批量设置key-value
hmget 批量获取字段值
hgetall 获取全部的数据
hdel 删除hash指定key字段
hlen 获取集合中键值对的个数
hexists 判断hash中是否存在指定字段
hkeys 获取所有key
hvals 获取所有的value
hincrby 指定增量
hsetnx 如果不存在 则可以设置,存在则不设置
案例
hash变更的数据 user name age.用户信息的保存等,更适合对象的存储,String更适合字符串存储
Zset(有序集合)
在set基础上增加了一个值
zadd 添加一个或多个值
zrangebyscore 按照score进行排序 递增
zrevrangebyscore 按照score进行排序 递减
zrem 移除对应元素
zcard 查询元素数量
zcount 查询对应区间的元素数量
其余API通过redis官网查询
案例 : set排序,班级成绩排序,工资表排序
权重消息,排行榜