redis 删除指定键值缓存值 redis删除指定value的key_字符串


字符串
一种最基本的Redis值类型(字节数组)
Redis字符串是二进制安全的,一个Redis字符串能包含任意类型的数据。例如: 一张JPEG格式的图片或者一个序列化的Ruby对象。一个字符串类型的值最多能存储512M字节的内容

key : string
value: string

设置字符串值 set get
SET key value [EX seconds] [PX milliseconds] [NX|XX]
EX 设置过期时间,秒,等同于SETEX key seconds value
PX 设置过期时间,毫秒,等同于PSETEX key milliseconds value
NX 键不存在,才能设置,等同于SETNX key value
XX 键存在时,才能设置

设置多个键的字符串值

MSET key value [key value ...] 键不存在时,设置字符串值
MSETNX key value [key value ...]注意是原子操作,对多个kv,要不成功都不成功
set s1 abc
set s2 12
set se abc ex 15
mset s3 3 s4 4 s5 5
msetnx s5 A5 s6 6

Redis中可以给Key设置一个生存时间(秒或毫秒),当达到这个时长后,这些键值将会被自动删除设置多少秒或者毫秒后过期

EXPIRE key seconds
 set key val ex 10或者 setex key time(s) value
 PEXPIRE key milliseconds设置在指定Unix时间戳过期
 EXPIREAT key timestamp
 PEXPIREAT key milliseconds-timestamp删除过期
 PERSIST(persist) key
Time To Live,Key的剩余生存时间查看剩余生存时间
 TTL key
 PTTL key
key存在但没有设置TTL,返回-1
key存在,但还在生存期内,返回剩余的秒或者毫秒
key曾经存在,但已经消亡,返回-2(2.8版本之前返回-1)
set se abc ex 15
ttl s6
expire s6 60
pttl s6
persist s6
pttl s6
EXPIREAT cache 1355292000
PEXPIREAT mykey 1555555555005

查找键

KEYS pattern
pattern取值
* 任意长度字符
? 任意一个字符
[] 字符集合,表示可以是集合中的任意一个
keys s*
keys s?
keys s[13]
keys *
keys ??键是否存在
 EXISTS key键重命名
 RENAME key newkey
 RENAMENX key newkey键删除
 DEL key [key ...]获取值
 GET key获取多个给定的键的值
 MGET key [key ...]返回旧值并设置新值
 GETSET key value如果键不存在,就创建并赋值字符串长度
 STRLEN key
 object encoding key 获取value底层存储的数据结构类型

键类型
TYPE key
字符串类型的内部编码有3种:int:8个字节的长整型。embstr:小于等于39个字节的字符串。raw大于39个字节的字符串。
Redis会根据当前值的类型和长度决定使用哪种内部编码实现。追加字符串
APPEND key value
如果键存在就追加;如果不存在就等同于SET key value获取子字符串 索引
GETRANGE key start end
0 3 0 -1(获取所有的内容)
索引值从0开始,负数表示从字符串右边向左数起,
-1表示最右一个字符,负号减轻复杂度覆盖字符串

SETRANGE key offset value
APPEND s6 123
getrange s1 1 2
getrange s1 0 -1
getrange s1 -2 -1
getrange s1 0 10000
SETRANGE s6 3 e
SETRANGE s6 3 efghijk
SETRANGE newkey 5 hello
SETRANGE s6 3 efghijk步长1的增减
 INCR key
 DECR key字符串值会被解释成64位有符号的十进制整数来操作,结果依然转成字符串步长增减 float
 INCRBY key decrement
 DECRBY key decrement 字符串值会被解释成64位有符号的十进制整数来操作,结果依然转成字符串位图bitmap[字节数组]redis:类型(字符串,列表,集合) type
 encoding


redis:底层字节数组
位图不是真正的数据类型。它是定义在字符串类型中
一个字符串类型的值最多能存储512M字节的内容位上限:2……(9(512))+10(1024)+10(1024)+3(8b=1B)=2^32b设置某一位上的值
SETBIT(setbit) key offset value (0/1)
offset位偏移量,从0开始获取某一位上的值
GETBIT(getbit) key offset返回指定值0或者1在指定区间上第一次出现的位置偏移量
BITPOS (bitpos) key bit [start] [end](字节索引)
bitpos k1 1 1 1
k2: 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0
k3: 0 1 0 0 0 0 1 0
0 1 0 1 0 0 0 1 0 1 0 0 0 0 1 0
setbit k1 1 1
//set str1 ab
setbit str1 6 1
setbit str1 7 0
get str1
这个结果是什么?bb
位操作
0 1 0 0 0 0 0 1
1 1 1 0 0 0 0 1
0 1 0 0 0 0 0 1
对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上
operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种
BITOP AND destkey key [key ...] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey
BITOP OR destkey key [key ...] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey
BITOP XOR destkey key [key ...] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey
BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到 destkey
除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入,当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0,空的 key 也被看作是包含 0 的字符串序列
思考:a位或b是什么?

///
统计指定位区间上值为1的个数 字节
 bitpos key bit(0/1) start end > start end bit位的索引
 BITCOUNT key [start] [end] > start end Byte位的索引 正负方向
 set k ab bitcount k 1 1
 从左向右从0开始,从右向左从-1开始,注意官方start、end是位,测试后是字节
 BITCOUNT testkey 0 0表示从索引为0个字节到索引为0个字节,就是第一个字节的统计
 BITCOUNT testkey 0 -1等同于BITCOUNT testkey
 最常用的就是 BITCOUNT testkey
//


redis 删除指定键值缓存值 redis删除指定value的key_redis 删除指定键值缓存值_02


//登录不同的库
 redis-cli --help
 redis-cli -n 2
清除当前库数据
 FLUSHDB
清除所有库中的数据
 FLUSHALL
//
网站用户的上线次数统计(活跃用户)
用户ID为key,天作为offset,上线置为1 366> 000000000000000
366 /8 50Byte 16 50
key: sean value: 11 1 000000000000000001010000000000000000
ID为500的用户,今年的第1天上线、第30天上线
SETBIT u500 1 1 1 0 0 000 0 …….1 0 00 0 > 365 /8 46 Byte
SETBIT u500 30 1
BITCOUNT user0 0 -1
KYES u*
按天统计网站活跃用户
天作为key,用户ID为offset,上线置为1
求一段时间内活跃用户数 500 / 8 366 * 63Byte
SETBIT 20160601 15 1 1 1 0 1 00 00 00 0 00 00 0
SETBIT 20160603 123 1 0 1 0 0 00 00 01 0 00 00 0
SETBIT 20160606 123 1 0 1 0 0 00 00 01 0 00 00 0
求6月1日到6月10日的活跃用户
BITOP OR aaa 20160601 20160602 20160603 20160610
BITCOUNT aaa 0 -1 目标key为aaa
结果为2


Redis的list

  • 基于Linked List实现,双向无环链表
  • 元素是字符串类型
  • 列表头尾增删快,中间增删慢,增删元素是常态
  • 元素可以重复出现
  • 最多包含2^32-1元素


redis 删除指定键值缓存值 redis删除指定value的key_字段_03


redis 删除指定键值缓存值 redis删除指定value的key_redis 删除指定键值缓存值_02


命令说明

B block 块,阻塞
L left 左
R right 右
X exist 存在
左右或者头尾压入元素 string set key “abc”
LPUSH(lpush) key value [value ...]
LPUSHX (lpushx) key value
RPUSH(rpush) key value [value ...]
RPUSHX(rpushx) key value
左右或者头尾弹出元素
LPOP (lpop) key
RPOP(rpop) key
从一个列表尾部弹出元素压入到另一个列表的头部 string getset
 RPOPLPUSH(rpoplpush) source destination
返回列表指定范围元素
LRANGE(lrange) key start stop
LRANGE(lrange) key 0 -1 表示返回所有元素
获取指定位置的元素
 LINDEX(lindex) key index
设置指定位置元素的值
 LSET(lset) key index value
列表长度,元素个数 string strlen
 LLEN(lleb) key LRANGE(lange) KEY 0 -1


redis 删除指定键值缓存值 redis删除指定value的key_redis_05


去除指定范围 元素

LTRIM(ltrim) key start stop


举例

RPUSH(rpush) listkey c abc c ab 123 ab bj ab redis list
LTRIM(ltrim) listkey 0 -1
LTRIM(ltrim) listkey 1 -1
LTRIM(ltrim) listkey 1 10000
微博的评论最后500条
 LTRIM(ltrim) u1234:forumid:comments 0 499


redis 删除指定键值缓存值 redis删除指定value的key_redis_06


redis 删除指定键值缓存值 redis删除指定value的key_redis 删除指定键值缓存值_07


redis 删除指定键值缓存值 redis删除指定value的key_字符串_08


阻塞
如果弹出的列表不存在或者为空,就会阻塞
超时时间设置为0,就是永久阻塞,直到有数据可以弹出
如果多个客户端阻塞在同一个列表上,使用First In First Service原则,先到先服务
左右或者头尾阻塞弹出元素
BLPOP key [key ...] timeout
BRPOP key [key ...] timeout
从一个列表尾部阻塞弹出元素压入到另一个列表的头部
BRPOPLPUSH source destination timeout
redis 的hash散列


redis 删除指定键值缓存值 redis删除指定value的key_redis_09


  • 由field和关联的value组成的map键值对
  • field和value是字符串类型
  • 一个hash中最多包含2^32-1键值对


redis 删除指定键值缓存值 redis删除指定value的key_redis 删除key中某一元素_10


设置单个字段

HSET(hset) key field value
HSETNX (hsetnx)key field value


key的filed不存在的情况下执行,key不存在直接创建
设置多个字段

HMSET(hmset) key field value [field value ...]


返回字段个数

HLEN(hlen) key


判断字段是否存在

HEXISTS(hexists) key field


key或者field不存在,返回0
返回字段值

HGET key field


返回多个字段值

HMGET key field [field ...]


返回所有的键值对

HGETALL key


返回所有字段名

HKEYS key


返回所有值

HVALS key


在字段对应的值上进行整数的增量计算

HINCRBY key field increment


在字段对应的值上进行浮点数的增量计算

HINCRBYFLOAT key field increment


删除指定的字段

HDEL key field [field ...]


举例

HINCRBY numbers x 100
HINCRBY numbers x -50
HINCRBYFLOAT numbers x 3.14
HDEL numbers x
///
  • 节约内存空间
  • 每创建一个键,它都会为这个键储存一些附加的管理信息(比如这个键的类型,这个键最后一次被访问的时间等等)
  • 所以数据库里面的键越多,redis数据库服务器在储存附加管理信息方面耗费的内存就越多,花在管理数据库键上的CPU也会越多在字段对应的值上进行浮点数的增量计算


redis 删除指定键值缓存值 redis删除指定value的key_字段_11


微博的好友关注
用户ID为key,Field为好友ID,Value为关注时间

user:1000 user:606 20150808
xz pl 2011 zs 1949


用户维度统计
统计数包括:关注数、粉丝数、喜欢商品数、发帖数
用户为Key,不同维度为Field,Value为统计数
比如关注了5人

HSET user:100000 follow 5
HINCRBY user:100000 follow 1


不适合hash的情况

  • 使用二进制位操作命令:因为Redis目前支持对字符串键进行SETBIT、GETBIT、BITOP等操作,如果你想使用这些操作,那么只能使用字符串键,虽然散列也能保存二进制数据
  • 使用过期键功能:Redis的键过期功能目前只能对键进行过期操作,而不能对散列的字段进行过期操作,因此如果你要对键值对数据使用过期功能的话,那么只能把键值对储存在字符串里面

redis 的set集合


redis 删除指定键值缓存值 redis删除指定value的key_redis_09


无序的、去重的
元素是字符串类型
最多包含2^32-1元素


redis 删除指定键值缓存值 redis删除指定value的key_redis 删除key中某一元素_13


增加一个或多个元素

SADD key member [member ...]


如果元素已经存在,则自动忽略
举例

SADD friends peter
 SADD friends jack tom john
 SADD friends may tom


redis 删除指定键值缓存值 redis删除指定value的key_redis 删除指定键值缓存值_14


redis 删除指定键值缓存值 redis删除指定value的key_redis 删除key中某一元素_15


移除一个或者多个元素

SREM key member [member ...]


元素不存在,自动忽略
举例

SREM friends peter
 SREM friends tom john


返回集合包含的所有元素
SMEMBERS key
如果集合元素过多,例如百万个,需要遍历,可能会造成服务器阻塞,
生产环境应避免使用
检查给定元素是否存在于集合中
SISMEMBER key member
集合的无序性

SADD friendsnew "peter" "jack" "tom" "john" "may" "ben"
 SADD anotherfriends "peter" "jack" "tom" "john" "may" "ben"
 SMEMBERS friendsnew
 SMEMBERS anotherfriends


注意, SMEMBERS 有可能返回不同的结果,所以,如果需要存储有序且不重复的数据使用有序集合,存储有序可重复的使用列表
随机返回集合中指定个数的,适合抽奖
SRANDMEMBER key [count]
如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合 最多返回整个集合 conut>=0
如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值 count < 0 长度为count绝对值,元素可能重复
如果 count 为 0,返回空
如果 count 不指定,随机返回一个元素

举例
 SADD friend "peter" "jack" "tom" "john" "may" "ben"
 SRANDMEMBER friends 3
 SRANDMEMBER friends -5


返回集合中元素的个数
SCARD key
键的结果会保存信息,集合长度就记录在里面,所以不需要遍历
随机从集合中移除并返回这个被移除的元素
SPOP key
把元素从源集合移动到目标集合

SMOVE source destination member

差集,具有方向性
SDIFF key [key ...],从第一个key的集合中去除其他集合和自己的交集部分
SDIFFSTORE destination key [key ...],将差集结果存储在目标key中
举例

SADD number1 123 456 789
 SADD number2 123 456 999
 SDIFF number1 number2

redis 删除指定键值缓存值 redis删除指定value的key_redis 删除key中某一元素_16


交集
SINTER key [key ...],取所有集合交集部分
SINTERSTORE destination key [key ...],将交集结果存储在目标key中
举例

SADD number1 123 456 789
 SADD number2 123 456 999
 SINTER number1 number2


redis 删除指定键值缓存值 redis删除指定value的key_redis 删除指定键值缓存值_17


并集

SUNION key [key ...],取所有集合并集
 SUNIONSTORE destination key [key ...],将并集结果存储在目标key中
举例
 SADD number1 123 456 789
 SADD number2 123 456 999
 SUNION number1 number2


redis 删除指定键值缓存值 redis删除指定value的key_redis 删除key中某一元素_18


新浪微博的共同关注
需求:当用户访问另一个用户的时候,会显示出两个用户共同关注哪些相同的用户
设计:将每个用户关注的用户放在集合中,求交集即可
实现如下:

peter={'john','jack','may'}
 ben={'john','jack','tom'}
那么peter和ben的共同关注为:
 SINTER peter ben 结果为 {'john','jack'}