Redis相关操作以及概念

便利出所有的key,后面参数类似正则通配符的概念,一般不在生产环境中使用

keys *
keys he*
key he[h-l]*
key ph?

计算key的总数

dbsize# 判断key是否存在,存在返回1 ,不存在返回0

exists key# 删除 key,删除成功1 ,失败 0

del kee [key...]# 设置key的过期时间 秒

expire key seconds# 查看数据类型

type key

查看key剩余的过期时间 ;-2 代表不存在了,-1 代表key存在,并且并没有过期时间

ttl key# 去掉 key的过期时间

persist key

数据结构和内部编码

图示:

单线程为什么快?
1.纯内存
2.非阻塞IO
3.避免了线程切换和竟态消耗
注意
4.一次只运行一条命令
5.拒绝长(慢)命令 : keys,flushall,flushdb,slow lua script,mutil/exec,operate big value(collection)
6.其实不是单线程,在 fysnc file descriptor,close file descriptor
数据机构
Redis所有的key 都是字符串,value 分为不同的数据类型
字符串类型 :场景 缓存 计数器 分布式锁
记录网站访问量,缓存视频基本信息,分布式id生成器

使用示例

先从redis获取数据,如果为空,则从mysql从获取数据,在存入到 redis中

常用命令

get
set
del

key自增一,如果key不存在,自增后get(key)=1

incr key# key自减 1,不存在 get(key)=-1

decr key# key 自增 k ,key不存在,自增后 get(k)=k

incrby key k# key自减 k,key不存在 ,自减后 get(key)=-k

decrby key k

不管key是否存在,都设置

set key value# key 不存在,才设置

setnx key value# key存在,才设置

set key value xx

批量获取key,原子操作

mget key1 key2 key3 ..# 批量设置

mset key1 value1 key2 value2 ....

set key nwevalue 并返回旧的 value

getset key newvalue# 将value追加到旧的value

append key value# 返回字符串的长度(注意中文)

strlen key #获取集合的长度

增加key 对应的值3.5

incrbyfloat key 3.5# 获取字符串指定下标所有的值

getrange key start end# 设置指定下标所有对应的值

setrange key index value  

哈希键值结构 : key field value, field不能相同,value可以相同

获取hash key对应的field的value

hget key field

hget user:1:info age# 设置hash key对应的field的value

hset key field value

hset user:1:info name ronaldo# 删除hash key 对应的field的value

 hdel key field

判断 hash key是否有 field

hexists key field# 获取 hash key field的数量

hlen key

批量获取 hash key的一批field对应的值

hmget key field1 field2 ... fieldN# 批量设置 hash key的一批 field value

hmset key field1 value1 field2 value2 ...

返回 hask key 对应所有的 field 和value

hgetall key# 返回hash key对应所有field的value

hvals key# 返回 hash key对应所有的field

hkeys key

设置 hash key对应的field的value(field存在,则失败)

hsetnx key field value# hash key 对应的field的value自增 int counter

hincrby key field intcounter# hincrby浮点数版

bincrbyfloat key field floatCounter

场景:记录每个用户个人主页的访问量

hincrby user:1:info pageView count

字符串和哈希相比
string : 编程简单但是需要序列化,设置属性要操作整个数据
hash : 直观,节省空间,可以部分更新但是编程稍微复杂,ttl不好控制
列表类型: key-value ,value为有序的队列,并且可以重复的 list

从列表右端插入值

rpush key value1 value2 .....# 从列表左端插入值

lpush key value1 value2 ....# 在list指定的值前|后插入 newvalue

linsert key before|after value newValue# 从列表左侧弹出一个item  listkey

lpop key# 从列表右侧弹出一个item

rpop key# 根据count值,从列表中删除所有的value相等的项;count>0,从左到右,删除最多的count个value相等的
项;
count=0,删除所有value相等的项;count<0,从右到左,删除最多Math.abs(count)个value相等的项

lrem key count value# 按照索引范围修剪列表

ltrim key start end# 获取列表指定索引范围的所有item

lrange key start end(包含end)# 获取列表指定索引的item

lindex key index# 获取列表的长度

llen key# 设置列表指定索引值为newvalue

lset key index newvalue

lpop 阻塞版本,timeout时阻塞超时时间,timeout=0为永远阻塞
blpop key timeout
rpop阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞
brpop key timeout
示例:微博-TimeLine
集合类型 :无序,没有重合的元素,支持集合间的操作(set集合)
向集合 key 添加 element (如果 element已经存在,添加失败)
sadd key element

srem key element #移除索引所对应的key

计算集合的大小

scard user:1:follow# 判断it是否在集合中 返回1 存在

sismember user:1:follow it# 从集合中随机挑选count元素
srandmember user:1:follow count# 返回集合中所有的元素,是无序的
smembers user:1:follow
返回集合中的所有元素
redis 127.0.0.1:6379> SADD myset1 “hello”(integer) 1
redis 127.0.0.1:6379> SADD myset1 “world”(integer) 1
redis 127.0.0.1:6379> SMEMBERS myset11) "World"2) “Hello”

从集合中弹出元素

spop

集合间的操作# 差集 不同的东西

sdiff# 计算给定两个集合的差集
redis> SADD key1 “a”(integer) 1
redis> SADD key1 “b”(integer) 1
redis> SADD key1 “c”(integer) 1
redis> SADD key2 “c”(integer) 1
redis> SADD key2 “d”(integer) 1
redis> SADD key2 “e”(integer) 1
redis> SDIFF key1 key21) "a"2) “b”

sinterstore# 给定集合之间的交集存储在制定的集合中
redis 127.0.0.1:6379> SADD myset1 “hello”(integer) 1
redis 127.0.0.1:6379> SADD myset1 “foo”(integer) 1
redis 127.0.0.1:6379> SADD myset1 “bar”(integer) 1
redis 127.0.0.1:6379> SADD myset2 “hello”(integer) 1
redis 127.0.0.1:6379> SADD myset2 “world”(integer) 1
redis 127.0.0.1:6379> SINTERSTORE myset myset1 myset2(integer) 1
redis 127.0.0.1:6379> SMEMBERS myset1) “hello”

sunion
示例:抽奖系统,赞,踩等;添加标签,共同关注等
有序集合类型 : 有序,无重复元素
Sorted set(有序集合)
https://www.runoob.com/redis/redis-sorted-sets.html

添加 score和element ,score可以重复,但是 element不可以重复

zadd key score element
zadd user:1:ranking 225 tom

删除元素

zrem key element(可以是多个)
#返回元素的分数
zscore key element# 增加或减少元素的分数
zincrby key increScore element# 返回元素的总个数
zcard key

返回指定索引范围内的升序元素[分值]

zrange key start end [WITHSCORES]# 返回指定分手范围内的升序元素[分值]
zrangebyscore key minscore maxscore [withscores]# 返回有序集合内在指定分数范围内的个数
zcount key minScore maxScore# 删除指定排名内的升序元素,角标
zremrangebyrank key start end# 删除指定分数内的升序元素
zremrangebyscore key minScore maxScore

Zrevrank 将分数值按分数从大到小进行相应的排序
Zrevrange #返回有序集合中,指定区间的成员(从大到小排序)

redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES # 递增排列1) "peter"2) "3500"3) "tom"4) "4000"5) "jack"6) “5000”

redis 127.0.0.1:6379> ZREVRANGE salary 0 -1 WITHSCORES # 递减排列1) "jack"2) "5000"3) "tom"4) "4000"5) "peter"6) “3500”

zrevrangebysocre# 返回有序集中指定分数区间内的所有的成员。有序集成员按分数值递减(从大到小)的次序排列。
redis 127.0.0.1:6379> ZADD salary 10086 jack(integer) 1
redis > ZADD salary 5000 tom(integer) 1
redis 127.0.0.1:6379> ZADD salary 7500 peter(integer) 1
redis 127.0.0.1:6379> ZADD salary 3500 joe(integer) 1

redis 127.0.0.1:6379> ZREVRANGEBYSCORE salary +inf -inf # 逆序排列所有成员1) "jack"2) "peter"3) "tom"4) “joe”

redis 127.0.0.1:6379> ZREVRANGEBYSCORE salary 10000 2000 # 逆序排列薪水介于 10000 和 2000 之间的成员1) "peter"2) "tom"3) “joe”

Zinterstore 有序集的交集

有序集 mid_test

redis 127.0.0.1:6379> ZADD mid_test 70 “Li Lei”(integer) 1
redis 127.0.0.1:6379> ZADD mid_test 70 “Han Meimei”(integer) 1
redis 127.0.0.1:6379> ZADD mid_test 99.5 “Tom”(integer) 1

另一个有序集 fin_test

redis 127.0.0.1:6379> ZADD fin_test 88 “Li Lei”(integer) 1
redis 127.0.0.1:6379> ZADD fin_test 75 “Han Meimei”(integer) 1
redis 127.0.0.1:6379> ZADD fin_test 99.5 “Tom”(integer) 1

交集

redis 127.0.0.1:6379> ZINTERSTORE sum_point 2 mid_test fin_test(integer) 3

显示有序集内所有成员及其分数值

redis 127.0.0.1:6379> ZRANGE sum_point 0 -1 WITHSCORES 1) "Han Meimei"2) "145"3) "Li Lei"4) "158"5) "Tom"6) “199”

Zunionstore 计算给定的一个或多个有序集的并集
redis 127.0.0.1:6379> ZRANGE programmer 0 -1 WITHSCORES1) "peter"2) "2000"3) "jack"4) "3500"5) "tom"6) “5000”

redis 127.0.0.1:6379> ZRANGE manager 0 -1 WITHSCORES1) "herry"2) "2000"3) "mary"4) "3500"5) "bob"6) “4000”

redis 127.0.0.1:6379> ZUNIONSTORE salary 2 programmer manager WEIGHTS 1 3 # 公司决定加薪。。。除了程序员。。。(integer) 6

redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES1) "peter"2) "2000"3) "jack"4) "3500"5) "tom"6) "5000"7) "herry"8) "6000"9) "mary"10) "10500"11) "bob"12) “12000”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值