Redis学习
基本使用
启动
# 启动redis server
redis-server --port 6379
# 当存在多个Redis实例时,可以指定配置文件启动
redis-server ./redis.conf
redis-server ./redis16379.conf
# 启动redis client
redis-cli -p 6379
关闭
redis-cli shutdown
检测Redis连接是否正常
ping
# 返回PONG则是正常的
入门
-
添加key
SET bar 1
-
获取Redis中所有的键
# 不建议在生产环境中用,因为可能存在很多的键 # 支持 ?-匹配一个、 *-匹配任意字符、 []-表示范围,在[]里面的范围,a[b-d],表示可以匹配ab、ac、ad KEYS *
-
判断某个键是否存在
EXISTS bar # 返回1代表存在
-
删除某个键
DEL bar # 返回的删除的键的个数 这里是1 DEL bar1 bar2 # 那么此时返回的数字是2 DEL bar # 此时返回的0,因为没有删除任何键,bar已经在第一条命令删除了
-
判断某一个键的类型
# 这里返回是string TYPE bar
基本数据类型
字符串
字符串类型的key,每个key只能对应一个字符串
-
赋值、取值
# 设置dhb这个key的值是hello SET dhb hello # 设置成功返回OK GET dhb # 返回 "hello"
-
在原有字符串末尾追加
# 向dhb这个key的尾部追加world,返回的是追加后字符串的总长度,这里返回10 APPEND dhb world
-
获取字符串长度
# 获取dhb这个key的字符串长度 STRLEN dhb
-
同时设置多个键值
# 设置git 这个键的value是github,svn这个键的value是svnhub MSET git github svn svnHub # 格式 MSET key1 value1 key2 value2
-
同时获得多个键的值
# 获得git svn这两个键分别对应的value MGET git svn # 格式 MGET key1 key2
-
递增数字
# 让jack这个键,递增 INCR jack # 返回的是递增后的值 # 这里返回1,因为这个键一开始不存在
问:当两个Redis客户端连接同一个Redis时,都去调用INCR命令,在同一时刻拿到的原始数据都是1,那么此时两个客户端都是加1,这时Redis会把键值更新为2,却不是期望的3,如何处理?
答:Redis中所有的命令都是原子操作,无论多少个客户端连接,都不会出现上面这种情况。
-
递减数字
# 让dhb这个键,递减,返回的是递减后的值 DECR dhb
-
增加指定的整数
# 为dhb这个key,加4,返回的依旧是加完之后的值 INCRBY dhb 4
-
减去指定的整数
# 让dhb这个key,减4,返回的减完之后的值 DECRBY dhb 4
-
增加指定浮点数
# 为dhb这个key,加3.2,返回的是加完之后的值 INCRBYFLOAT dhb 3.2
值得注意的是,Redis没有提供减去指定浮点数的命令
散列 hash
一个散列类型的键可以包含 2 32 − 1 2^{32}-1 232−1个字段.散列类型适合存储对象,一个对象的多个属性可以分为多个field存储
-
赋值、取值
# 设置 car这个键的 price 这个field的值是500 HSET car price 500 # 获取 car这个键的price这个field的value HGET car price
-
同时设置多个键值
# 设置car这个键的name、address 分别为benchi、china HMSET car name benchi address china # 格式 HMSET key field1 value1 field2 value2
-
同时获得一个对象多字段个值
# 获得car这个键的name、address这两个字段的值 HMGET car name address
-
获得一个键的所有字段
HGETALL car # 返回的是,字段、字段值 1) "price" 2) "500" 3) "name" 4) "benchi" 5) "address" 6) "china"
-
判断某个字段是否存在
# 判断 car这个key的name字段是否存在 HEXISTS car name # 存在返回1、不存在返回0
-
当字段不存在是赋值
# 当car这个key的num字段不存在时,赋值为112,如果存在,则不执行任何操作 HSETNX car num 112
-
为字段增加数字
# 让car这个键的price字段加45,返回的是加完之后的值 HINCRBY car price 45 # 虽然没有提供减的操作,但是可以用【加负数】实现减法操作 HINCRBY car price -34
-
删除字段
# 删除car 这个键的price、name字段,返回的是被删除的个数,这里返回2 HDEL car price name
-
只获取所有字段名
# 获取 car 的键的所有field HKEYS car
-
只获取所有字段值
# 获取car的键的所有field的值 HVALS car
-
获取字段的数量
# 获得car这个键的filed的数量,返回的是field的数量 HLEN car
列表
列表通常用来向两端添加元素。
-
向列表两端添加元素
# 向mynum这个列表左侧添加元素 LPUSH mynum 1 # 向mynum这个列表左侧添加两个元素 LPUSH mynum 3 8 # 向mynum这个列表右侧添加元素 RPUSH mynum 2 # 向mynum这个列表右侧添加两个元素 RPUSH mynum 3 8 # 返回的结果是增加元素后列表的长度
-
获取列表中元素的个数
# 获取mynum这个list的元素个数 LLEN car
-
从列表两端弹出元素
# 从mynum这个list左侧弹出一个元素,返回值为弹出的元素 LPOP mynum # 从mynum这个list右侧弹出一个元素,返回值为弹出的元素 RPOP mynum #B的含义block,阻塞,直到有元素才会弹出,当mynum、mynum1、mynum2都有值时,会根据key的顺序依次弹出。场景应用在任务队列场景,当有多个任务队列,并且各个任务队列的任务优先级不一样时。 BRPOP mynum mynum1 mynum3
-
获得列表中的范围数据,LRANGE不会删除元素,仅仅返回,LPOP、RPOP则会删除元素
# 获取mynum这个list的索引在2至5之间的元素,即返回索引为2,3,4,5这个四个索引的元素 LRANGE mynum 2 5 可以使用负索引,代表最右边的第N个元素 LRANG mynum 2 -1 # 格式 LRANGE key start stop
如果start的索引位置比stop的索引位置靠后,则会返回一个空的列表,如
LRANG mynum -1 2 # 返回empty list or set
如果stop的索引位置大于实际索引范围,则会返回至列表最右边的元素,如
LRANGE mynum 2 999 # 返回,从索引2开始,一直到实际真正的索引的所有元素
-
删除列表中指定的值
# 删除左边前3个为4的值 LREM mynum 3 4 # 删除右边前2个为5的值 LREM mynum -2 5 # 删除所有为3的值 LREM mynum 0 3
-
向列表中固定位置插入元素
#在mycar这个list中的1的元素前面 插入元素7 LINSERT mycar before 1 7 #格式 LINSERT key before/after pivot value
-
将一个列表尾部的元素放置到另一个list的首部
# 将 mycar 这个list的尾部元素,弹出,并push进myhouse这个list的首部,两个list可以使同一个,这样就是循环向一个list的首部添加元素 RPOPLPUSH mycar myhouse # 返回的是 该元素的值
集合
集合中的元素是唯一的,不允许重复的,而列表中则不是,可以有多个一样的元素
-
增加、删除元素
# 向集合setA中添加 1 2 3这三个元素 SADD setA 1 2 3 # 删除集合setA中的 1 3 元素 SREM setA 1 3
-
获取集合中所有的元素
# 获取setA中的所有元素 SMEMBERS setA
-
判断集合中是否存在某一个元素
# 判断 setA中是否存在为2的元素,存在返回1,不存在返回0 SISMEMBER setA 2
-
集合的差集、交集、并集
# 求集合A 和 集合B的差集,即属于A,但是不属于B的元素 SDIFF setA setB # 可以使用多个集合,多个集合的差、交、并 按照顺序依次计算 SDIFF setA setB setC # 先计算 A和B的差集,用这个差集和C再求差集 # 求集合A 和 B 的交集 SINTER setA setB # 求集合A 和 B的并集 SUNION setA setB
-
获取集合中元素的个数,返回的是一共的元素的个数
SCARD setA
-
随机获得集合中的元素
# 随机获得集合中的元素 SRANDMEMBER setA 1 # 格式 SRANDMEMBER key [count] # 如果 count 是正数,则会随机从集合中获得count个不重复的元素,如果count大于集合元素的个数,则返回全部元素 # 如果 count是 负数,则随机从集合中获得 |count|个元素,但是可能重复
-
从集合中弹出一个元素
SPOP setB
有序集合
会根据score自动排序
-
添加、删除
# 向zset这个有序集合中添加两个 tom anmi这两个元素,根据这两个元素的score自动排序 ZADD zset 78 tom 89 anmi ZREM zset tom
-
获取某一个元素的分数
# 获取zset这个有序集合中国tom这个元素的分数 ZSCORE zset tom
-
给某一个元素加分
# 给有序集合zset中的tom元素加12分,返回的是加完分之后的分数 ZINCRBY zset 12 tom
-
获得某个范围内的元素列表。ZRANGE、ZREVRANGE
# 获得有序集合zset,索引从0 到2的元素,排序是从小到大 ZRANGE zset 0 2 # 返回 tom anmi jack # 如果想要获得元素的同时还要获得对应的分数 ZRANGE zset 0 2 WITHSCORES # 返回 tom 78 anmi 89 jack 99 ZREVRANGE的返回顺序是从大到小
如果两个元素的分数一样,则按照ASCI码中值进行排序,如果是中文,取决于对应的编码方式,最终还是会将其转换为ASCI码进行排序
-
获取某个分数范围的元素
# 获得有序集合zset中,分数在 >=10 <= 50的元素 ZRANGEBYSCORE zst 10 50 # 如果想要获得元素的同时还要获得对应的分数 ZRANGEBYSCORE zst 10 50 WITHSCORES # 如果想要不包含其中的某一个端点、或者不包含两个端点,使用 ( , >=10 <50的元素 ZRANGEBYSCORE zset 10 (50 # 获取有序集合zset元素分数在10,50之间的前三个元素,不要忘了,这里是从小到大排序的,如果想要从大到小,则依旧使用ZREVRANGEBYSCORE ZRANGEBYSCORE zset 10 50 LIMIT 0 3 # 格式 ZRANGEBYSCORE key min max LIMIT offset count
-
获得集合中元素的个数
ZCARD zset
-
获得指定分数范围内的元素的个数
ZCOUNT zset 10 50
-
获得元素的排名
# 这里获得排名是按照从小到大的顺序 ZRANK zset jack # 如果想要从大到小的顺序,则使用 ZREVRANK zset jack
-
删除指定分数范围内的元素
# 删除有序集合zset中国分数>=10,<=20的元素 ZREMRANGEBYSCORE zset 10 20
备注
- Redis不区分命令的大小写
- Redis对于键的命名最好采用, 对象类型:对象ID:对象属性来命名一个键
有用的资料
- Redis官方命令合集,忘记时可快速搜索
- Redis官方文档,无论什么时候,官方文档都是入门、解决问题的最推荐的方式
术语
- Time To Live -TTL,生存时间
- Race Condition,竞态条件
- Round-trip delay time(round trip time),往返时延