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