一、基础命令
select 2 选择2号数据库,redis默认有16个数据库,默认进入0号数据库
flushdb 删除当前数据库数据
flushall 删除所有数据库数据
keys * 查看当前库所以的key
exists key 是否存在key,返回1或0
move key 新的数据库 移动key到新数据库,一般不会用,如move key 3
expire key seconds设置过期时间,num单位是秒,如10,就是十秒后过期
ttl key 查看这个key还有多久过期,若该key未设置过期时间返回-1,当用户过期后返回-2
type key 查看key是什么类型
shutdown 关闭redis服务端
二、string(字符串)
默认情况下我们set key value就是字符类型
append key value ,value用引号包裹,会在原来的v后面追加值,若key不存在,就新增一个key,此时相当于set key value
strlen key 获取这个key对应v的长度
关于文章浏览量:我们不能每次都去数据库里加一或减一,可以在redis里做
set views 0 # 设置一个key作为文章的浏览量
incr views 每次对views加一
INCRBY views 10 每次对views加10,相当于设置步长
decr views 每次对views减一
DECRBY views 5 每次对views减5
切片:都是闭区间
set key1 hello,world
GETRANGE key1 0 3 截取key1第0-3的字符,是闭区间 "hell"
GETRANGE key1 0 -1 截取整个字符串
getrange key1 -1 -2 不会报错,但是返回空字符创
getrange key1 -2 -1 倒数第二个字符开始切片到最后,返回ld
替换:
set key1 abcdefgh
# SETRANGE key 偏移量 value
SETRANGE key1 1 xx
axxdefgh # 表示从索引1开始向后替换,而不是把索引1替换成xx,若超过了原来的长度,自动扩容
设置过期时间:setex
# setex(set with expire) # 在创key的时候就设置过期时间
setex key1 30 "hello"
# setnx(set if not exist) # 不存在再设置,在分布式锁中常用
setnx key2 "redis" # 如果key2这个键不存在,就可以创建这个key。返回1
setnx key2 "mysql" # 此时key2已经存在,就创建失败返回0而不是覆盖
批量设置值:mset
mset k1 v1 k2 v2 k3 v3 # 批量设置,设置三个键值对
mget k1 k2 k3 # 批量获取值
msetnx k1 v1 k4 v4 # msetnx是一个原子性操作,因为k1已经有了,所以无法创建,所以k4也不能设置
get k4 此时会返回空
先获取再操作,getset
先get再set,可用来做更新操作,如果值不存在就返回空,然后把后面的值设置进去,如果有值就返回值
getset db redis # 此时db没有值,返回空
(nil)
get db # 设置完了值,我们可以正常get
"redis"
getset db mysql # db现在有值是redis,返回redis,然后设置新的value是mysql
"redis"
get db # 设置了新的值我们get的值也是新的值
"mysql"
三、list(列表类型)
在redis里,可以把list设置成队列,栈,阻塞队列等,所有的list命令都是l开头。
他实际是一个链表。
如果key不存在,就创建新的链表,如果key存在,就新增内容
如果移除了所有的值,就成了空链表,也就不存在了
因为是链表,所以在两边插入或者改动值的效率最高,对中间元素的效率较低
# lpush为从左向右加值,rpush为从右向左加值
LPUSH list one # 以list为key,one为值进行存值
LPUSH list two
LPUSH list three
# lrange 相当于切片
LRANGE list 0 -1 # 返回three,two,one,也可以用来查看当前这个列表内的元素
LRANGE list 0 1 # 返回three,two
# Lpop 从左边开始删除值,RPOP从右边开始删除值
Lpop list
Rpop list
lindex list 2 # 根据索引取值
Llen list # 返回长度
lrem list 2 one # 在list里,移除one这个值,从上往下移除两个,也可以只移除第一个,就写1,可以用于取消关注等
ltrim list 1 2 # 截取,剩下的list就是我们截取的,写1,-1就是全部截取
rpoppush list1 list2 # 把list1的右边第一个值移动到list2里
lset list 0 hello # 相当于替换操作
linsert list before hello other # 插入,可指定在前面before或者后面after,在hello前面插入other
四、set(集合类型)
set中的值不能重复,基本数据结构,python中也有。集合常常用于比如微博,A用户所有关注的人放在一个集合里,A的粉丝都放在另一个集合。然后就可以很容易的找到共同关注,共同好友,共同爱好,好友推荐等等。
sadd set1 'hello'
sadd set1 'hello1'
sadd set1 'hello2'
smembers set1 # 返回集合里的元素
sismenber set1 hello # 看看hello在不在set1里面。返回1,则存在,返回0,就不存在
scard set1 # 获取集合中元素个数,注意和smembers的区别
srem set1 hello # 移除某个元素
srandmember set1 # 随机获取集合中的一个元素
srandmember set1 2 # 随机获取集合中的两个元素
spop set1 # 随机移除一个元素,比如抽奖的时候,可以随机移除一个元素,这个人就是获奖的人
smove set1 set2 hello # 把hello从set1移动到set2
# 共同关注,就是并集,在python中,可以用set1 & set2
sdiff set1 set2 # 差集
sinter set1 set2 # 交集
sunion set1 set2 # 并集
五、hash(哈希类型,散列表)
hset hash1 f1 yang # 存值
hget hash1 f1 # 取值
hmset hash1 f1 yang f2 egon # 批量存值
hmget hash1 f1 f2 # 批量取值
hgetall hash1 # 获取所有值
hdel hash1 f1 # 指定删除key,可以同时删除多个
hlen hash1 # 获取长度
hexists hash1 f1 # 判断指定字段是否存在
hkeys hash1 # 获取hash的所有key
hvals hash1 # 获取hash的所有values
HINCRBY hash1 num 2 # 步长为2递增
HINCRBY hash1 num -2 # 相当与hdecrby
hsetnx 和str类型一样
存变更的数据,尤其是变动的数据,比如user有name和age。hash更适合对象的存储,str更适合字符串的存储。
hset user:1 name yang age:18
hget user:1 name
六、Zset(有序集合)
有序集合,在set基础上增加了一个值
zadd zset1 1 one # 存值
zadd zset1 2 two 3 three # 批量存值
zrange zset1 0 -1 # 查看zset1里的所有元素
zadd salary 2500 yang 5000 egon 8000 lqz
zrangebycore salary -inf +inf # 从最小值到最大值排序
zrangebycore salary -inf +inf withscores
zrangebycore salary -inf 5000
zrevrange salary 0 -1 # 从最大值到最小值排序
zrem salary yang
zcard zset1 # 获取有序集合中的个数
zcount zset1 1 3 # 获取指定区间内的元素个数,闭区间且开始索引位1
用处:
可以排序班级成绩,公司的工资,阅读排行榜等等,处理一些不是很重要的排序。
或者设计一个信息的通知,普通信息 1 重要信息 2 紧急信息 3