Redis
Redis是单线程+多路IO复用
多路IO复用:相当于异步调用操作,你把数据传给redis,你可以先去干别的
Redis五大常用数据
String、List、Set、Hash、Zset
String
keys * 查看当前库所有key
exists key 判断某个key是否存在
set key value // set k1 mary
del key 删除key 直接删
unlinke //非阻塞删除,真正的删除会在后面的异步操作
type key // key的类型
expire key time //给key设置过期时间
ttl key 查询过期时间 1还在 -2代表过期 -1永不过期
select 切换数据库
dbsize 查看当前库有多少个key
flushdb 清空当前库
flushall 清空所有库
String
string是最基本的类型,是二进制安全的,可以存储任何数据,一个字符串最大512M
set key value 新增数据,设置相同的key会覆盖前面的
get key 取值
append key value 给key追加数据
strlen key 获取key长度
setnx key value 当key不存在时才可新增,若key存在本次插入无效
incr key 给key的值++(原子操作)
decr key 给key值— (原子操作)
incrby key step key增大step
decrby key setp key减小step
下面三个其中一条失败,整条数据都失败
mset key1 value1 key2 value2 …… 一次设置多个值
mget key1 key2 key3 …… 一次取多个值
msetnx key1 value1 key2 value2 ……
getrange key start end // 取key的start到end的值
k1 = lucymary
getrange k1 0 3 // lucy
setrange key index value //对key index位置加上value
setrange k1 3 abc // lucabcry
setex key time value 给key设置过期时间
getset key value 以新值换旧值
k1 = tao
getset k1 tao123 // “tao”
取出的tao 但是k1的值已经被改成tao123了
string底层相当于arrayList,会自动扩容
List
Redis的列表相当于LinkList,是双向链表,两端的操作性能很高,通过索引下标操作中间节点比较困难,比较耗时
lpush 头插法
lpush key value1 value2 value3 从左边插入
lpush k1 1 2 3,底层存储实际为 3 2 1(头插法)
rpush 尾插法
rpush key value1 value2 value3 从右边插入
rpush k1 1 2 3 ,底层存储 1 2 3
键在值在,值忘键忘
lpop k1 从左边取个值
rpop k1 从右边取值
lrange key start end
lrange key 0 -1 取所有的值
rpoplpush k1 k2 从k1的右边取值放到k2的左边
lindex key index 返回指定位置的值
llen key 获取列表长度
linsert key after/before value newvalue 在key value 前面或后面插入newValue
lrem key number value 从左边开始删除number 个值为value的数据
lset key index value 替换index位置的值为value
Set
set是无序且自动去重的,底层为hash表,时间复杂度为O(1)
sadd key value1 value2 value3
smembers key 取值
sismember key value 表示key中是否存在value
scard key 返回集合元素个数
srem key value1 value2 删除指定元素
spop key 随机吐出一个元素
srandmember key n 随机取n个值
smove key1 key2 value 把key1中的值移到key2
sinter key1 key2 取两集合交集
sunion key1 key2 并集
sdiff key1 key2 取差集(key1中的有,key2没有 )
Hash
使用场景:存储对象 存储点赞 网站访问量
hset key field value // 新增
eg. hset user:1001 name tao
hget key field
eg hget user:1001 name
hmset key1 field1 value1 field2 value2 // 批量新增属性
eg. hmset user:1002 name tao age 12
hexists key filed 查看属性是否存在
hkeys key 列出所有属性
hvals key 列出所有value
hincrby key field increment
eg. hincrby user:1001 age 1 给age+1 也可以为负数
hsetnx key field value 将key的field替换为value
Zset
zset是有序的set,通过评分使数据有序
底层相当于map
zadd key score value1 scoure2 value2
eg. zadd topn 200 java 300 c++ 400 mysql
内部 java c++ mysq 从小到大排序
zrange key start end 从中取出
eg. zrange topn 0 -1 取出全部
zrange topn 0 -1 withscopres 可带着评分一起取出来
zrangebyscore key min max 按分数范围列出值 从小到大
zrevrangebyscore key max min 从大到小排序
zincrby key score value 给value加分
zrem key value 删除某个值
zcount key min max 统计分数区间内有多少个值
zrank key value 返回在集合中的排名
发布订阅
订阅
SUBSCRIBE channel_name
eg. subscribe channel1
发布
publish channel_name message
eg. publish channel hello