Redis 后端运行
正常情况下,通过
redis-server redis.conf
运行 Redis 是这样的:
控制台被占领了,不能操作了;可以通过修改配置 redis.conf 配置文件,使得 Redis 在后端运行:
基本类型一 String
String 是 Reis 里最简单的数据结构。在 Redis 中,五种数据类型的 key 全部都是字符串,因 value 不同而类型不同
Redis 中的字符串都是动态字符串。内部都是可以修改的,像 Java 中的 StringBuffer。它采用分配冗余空间的方式来减少内存的频繁分配。在 Redis 内部结构中,实际分配内存要大于需要的内存,当字符串小于 1M 时,都在现有空间上加倍;如果超过 1M,每次扩容 1M ,最大 512 M。下面时常用命令
- append
使用 append 命令时,如果 key 已经存在,则直接在对应的 value 后追加值。否则创建新的键值对
- decr
可以实现对 value 的减 1 操作,前提时 value 时一个数字,否则报错。如果 value 不存在,则会给一个默认值 0 ,在默认值的基础上减 1
- decrby
设置减法的固定步长,命令的第二个参数是步长
- get
用来获取一个 key 的 value,截图略 - getrange
可以用来返回 key 对应的子串,有点像 Java 中的 substring,第二个、第三个参数代表起止位置
- getset
获取并更新某一个 key
- incr
可以实现 value 的自增,默认增 1
- incrby
自增可以设置步长
- incrbyfloat
和 incrby 类似,但是自增的步长可以设置为浮点数
- mget 和 mset
批量的获取和批量设置
- setex
给 key 设置 value ,同时设置过期时间。
- psetex
与 setex 类型,不过设置有效期时间单位是毫秒
-setnx
如果 key 存在,不会覆盖,不存在才 set 成功
- msetnx
批量的 setnx 操作,如果有一个失败,所有的都会失败
- setrange
从指定下标开始覆盖字符串
- strlen
查看字符串的长度
一.一 BIT 命令
在 redis 中,字符串都是以二进制方式来存储的,例如 执行
set k1 a
后,a 的 ASCII 码是 97,97 转为二进制是 01100001,BIT 命令就是对二进制进行操作的
- getbit
key对应的 value,在 offset 处的二进制的值,offset 以 0 开始
- setbit
修改 key 的 value 在 offset 处的 bit 值
- bitcount
统计二进制数据中 1 的个数
有一个比较好的案例是用 BIT 来记录用户 peter 的登录次数
第一次登录
setbit peter 01
setbit peter 1 1
setbit peter 2 1
# 一年
setbit peter 365 1
# 10 年
setbit peter 3650 1
用 bitcount 就可以计算出 peter 的登录次数,且内存占用特别小,因为一天一次登录占 1个 bit,一年 365 个 bit,10 年 3650 bit,8 个 bit 是一个字节,1024个字节是 1kb,那么10 年记录登录次数的内存是 3650/8*1024 = 0.45kb.
- bitop
bit的逻辑运算操作,包括与(and)、或(or)、非(not)、异或(xor)等,这里示例略,不常用的到,只举一个或的例子:
基本类型二 List
- lpush
表示 value 值从左到右依次插入表头(我更愿意理解为从左到右的入栈),类似栈的功能
- lrange
返回列表中指定元素,0 代表第一个,-1 代表最后一个,并且只要 redis 中涉及下标的操作都可以用 0,-1 代表第一个和最后一个
- rpush
与 lpush 的功能类似,不同的是从表头尾部添加元素(可以认为是从左到右的尾部入栈)。
- rpop
移除并返回列表的尾元素
- lpop
返回列表的头部元素
- lindex
返回列表中下标为 index 的元素
- ltrim
类似 Java 中 String 类的 sublist,把当前的 list 截取后再次赋给该引用。可以用 -1、-2、-3 等代替倒数第一个下标、倒数第二个下标、倒数第三个下标:
- blpop
阻塞式弹出,相当于 lpop 的阻塞版。
同时需要设置阻塞时间,时间内有值弹出,无值阻塞,如果阻塞期间有新值进入,则弹出新值,阻塞结束,并返回阻塞时间
基本类型三 Set
-
sadd
添加元素到指定 key 的 value 中
-
smembers
返回指定 key 对应 set 的所有元素
-
rem
删除指定 key 对应 set 中的某个元素
-
sismember
返回一个成员是否在 指定 key 对应的 set 中的判断,0 代表不存在, 1代表存在
-
scard
返回集合的数量
-
srandmember
随机返回一个元素,不会移除,可以设置返回数量,数量大于等于集合的数量,全部返回
-
spop
随机返回并移除一个或多个元素
-smove
把一个元素从一个集合移动到另一个集合中去
-
sdiff
返回两集合的差集,顺序不同,结果不同,返回第一个集合参数中两者的差集
-
sinter
返回两集合的交集
-
sunion
返回两个 set 集合的并集
-
sdiffstore
类似于 sdiff,不同的是把差集存储到指定的集合中
-sinterstore
类似于 sinter,不同的是把差集存储到指定的集合中
-
sunionstore
类似于 sunion,不同的是把差集存储到指定的集合中
基本类型四 Hash
String 、List 、Set 三种类型中 value 的类型是 String 、List 、Set,是 key - value 类型,而 Hash 类型中 value 也是一个 key - value 类型
-
hset
添加值,可以添加多个
-
hget
获取值,只能获取一个值
-
hmset
批量设置,Redis 4.0.0,HMSET被视为已弃用。请在新代码中使用HSET。 -
hmget
与 hget 类似,不同的是可以批量的获取值
-
hdel
删除一个或多个指定 feild
-
hsetnx
默认情况下使用 hset,如果与 value 中的feild 相同,会覆盖已有的 value 中的值,hsetnx 则不会
-
hvals
获取 value 的所有属性
-
hkeys
获取 Hash 结构中所有的 key
-
hgetall
-
同时获取所有的 key 和 value
-
hexists
判断某个属性是否存在与指定的 key 对应 value 中的属性,存在返回 1,不存在返回 0;
-
hincrby
给指定的 key 对应的 value 中的数值属性自增
-
hincrbyfloat
给指定的 key 对应的 value 中的数值属性自增(浮点数)
-
hlen
给指定的 key 对应的 value 中的属性的个数
-
hstrlen
给指定的 key 对应的 value 中的字符串属性的长度
基本类型五 ZSet
-
zadd
将指定元素添加到有序集合中,需要指定每个元素的分数,分数越小,排名越靠前
-
zrange
按下标返回集合中的一组元素
-
zscore
返回 member 的 score 值
-
zrevrange
按下标返回集合中的一组元素,但是是倒序
-
zcard
返回元素的数量
-
zcount
返回指定 score 区间内,元素的数量
-
zrangebyscore
返回指定 score 区间内的元素
-
zrank
返回元素的下标(正序)
-
zrevrank
返回元素的下标(倒序)
-
zincrby
设置某个元素的 score 值自增
-
zrem
弹出一个指定元素
-
zlexcount
返回指定元素区间内元素个数,闭区间用 [ 前缀(与 zcount 不同,zcount 闭区间不用加前缀即可),开区间用 ( 前缀
-
zrangebylex
按照指定的元素区间返回元素成员
key
key 的命令操作,是在五种数据类型都能用的操作
- del
删除指定的一个 key - value
- dump
序列化指定的 key
- exists
判断指定 key 对应的数据是否存在,存在返回 1,不存在返回 0;
- ttl
查看 一个 key 的有效期
- exprie
给一个 key 设置有效期,如果 key 在过期前被重新 set,则过期时间失效
- persist
移除一个 key 的过期时间
- keys *
查看所有的 key
- pttl
功能和 ttl 一样,查看过期时间,不同的是返回的是毫秒
补充
- 在 redis 中,容器的四种类型(List、Set、Hash、ZSet),在第一次使用,如果容器不存在,就自动创建一个;如果容器里边没有元素了,那么立即删除容器,释放内存