Redis入门
一、Redis简介
1、概括
Redis是一个开源的、高性能的、基于键值对的缓存与存储系统,通过提供多种键值数据类型类适应不同场景下的缓存与存储需求。同时的诸多高层级功能使其可以胜任消息队列、任务队列等不同的角色。
Redis是Remote Dictionary Server(远程字典服务器)的缩写,它以字典结构存储数据,并允许其他应用通过TCP协议读写字典中的内容
2、特性
存储结构
Redis采用字典结构(key-value)的存储方式,支持多种键值数据类型。目前为止Redis支持的键值数据类型如下:
- 字符串类型
- 散列类型
- 列表类型
- 集合类型
- 有序集合类型
内存存储与持久化
-
Redis数据库中的所有数据都存储在内存中,由于内存的读写性能远高于硬盘,因此Redis在性能上对比其他基于硬盘存储的数据库有非常明显的优势。
-
Redis提供对持久化的支持,即可以将内存中的数据异步写入到硬盘中,同时不影响继续提供服务
功能丰富
- 可以作为缓存系统使用。利用Redis可以为每一个键设置生存时间这一功能
- 可以实现队列。利用列表类型
- 支持发布/订阅模式
简单稳定
Redis直观的存储结构使得通过程序与redis交互十分简单
3、杂记
命令:
- Redis中命令都是原子性的
- Redis中命令不区分大小写
二、Redis中的5中基础类型
1、字符串类型
简介
字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据。一个字符串类型键允许存储的数据的最大容量是512MB
命令
(1)赋值与取值 set/get
set key value
get key
例子:
redis>set key hello
ok
redis>get key
"hello"
(2)递增数字 incr
incr key
-
说明:当存储的字符串是整数时,Redis提供了一个实用的命令
incr
,其作用是让当前键值递增,并返回递增后的值。当前不存在时会默认键值为0,再执行递增。当键不是整数时提示错误。 -
用法;
redis> incr num (integer) 1 redis> incr num (integer) 2 redis> set foo lorem ok redis> incr foo (error) ERR value is not an integer or out of range
(3)增加指定的整数 incrby
incrby key increment
-
说明:
incrby
和incr
命令基本一样,只不过前者可以通过increment参数指定一次增加的数值 -
用法:
redis> incrby bar 2 (integer) 2 redis> incrby bar 3 (integer) 5
(4)减少指定整数 decr/decrby
decr key
decr key decrement
-
说明:
decr
和incr
命令用法相同,只不过是让键值递减 -
用法:
redis> set bar 5 ok redis> decr bar (integer) 4 redis> decrby bar 2 (integer) 2
(5)增加指定浮点数 incrbyfloat
incrbyfloat key increment
-
说明:
incrbyfloat
类似于incrby
,只不过前者可以递增一个双进度浮点数 -
用法:
redis> set bar 4 ok redis> incrbyfloat bar 2.7 "6.7" redis> incrbyfloat bar 5e+4 "50006.699999999997"
(6)向尾部追加值 append
append key value
-
说明:向键值末尾追加值,如果键不存在,则将该键的值设置为value,返回值是追加后字符串总的长度。如果追加的值中间有空格,则需要添加双引号
-
用法:
redis> set key hello ok redis> append key " world" (integer) 11 redis> get key "hello world"
(7)获取字符串长度 strlen
strlen key
-
说明:返回键值的长度,如果键不存在则返回0
-
用法:
redis> set key "hello world!" ok redis> strlen key (integer) 12 redis> set key 你好 ok redis> strlen key (integer) 6 # 中文使用的是utf-8编码,每个长度为3
(8)同时获取/设置多个键值 mget/mset
mget key [key...]
mset key value [key value...]
-
说明:同时设置或者获取多个键值
-
用法:
redis> mset key1 v1 key2 v2 key3 v3 ok redis> get key2 "v2" redis> mget key1 key2 1) "v1" 2) "v2"
(9)位操作 getbit/setbit/bitcount/bitop/bitpos
getbit key offset
setbit key offset value
bitcount key [start] [end]
bitop operation destkey key [key...]
bitpos key value [start] [stop]
-
getbit
-
说明:获得一个字符串类型键指定位置的二进制位的值(0或1),索引从0开始
-
用法:
redis> set foo bar ok redis> getbit foo 0 (integer) 0 redis> getbit foo 6 (integer) 1 redis> getbit foo 10000 (integer) 0 # bar转换为二进制之后 # b a r # 01100010 01100001 01110010 # 0位置上返回0 # 6位置上返回1 # 10000超出了键值的二进制位,默认为0
-
-
setbit
-
说明:设置字符串类型键指定位置的二进制位的值。如果设置的位置超过了键值的二进制位的长度,
setbit
命令会自动将中间的二进制位设置为0,同理,设置一个不存在的键的指定二进制位的值会自动将其前面的位赋值为0 -
用法:
redis> set foo bar ok redis> setbit foo 6 0 (integer) 1 redis> setbit foo 7 1 (integer) 0 redis> get foo "aar" # bar转换为二进制之后 # b a r # 01100010 01100001 01110010 # # 通过上述命令之后变为 # a a r # 01100001 01100001 01110010 # 设置不存在的键 redis> setbit nofoo 10 1 (integet) 0 redis> getbit nofoo 5 (integer) 0
-
-
bitcount
-
说明:获得字符串类型键中值是1的二进制位个数,可以通过参数来限制统计的范围,参数的单位是字节
-
用法
redis> set foo bar ok redis> bitcount foo (integer) 10 # 统计前两个字节 redis> bitcount foo 0 1 (integer) 6
-
-
bitop
-
说明:可以对多个字符串类型键进行位运算,并将结果存储在destkey参数指定的键中。
bitiop
支持的运算符有and,or,xor,not
-
用法:
redis> set foo1 bar ok redis> set foo2 aar ok redis> bitop or res foo1 foo2 (integer) 3 redis> get res "car"
-
-
bitpos
-
说明:获得指定键的第一个位值是0或者1的位置。如果不指定结束字节且所有的二进制位为1,则当要查询值为0的二进制偏移量的时候,返回结果是键值长度的下一个位置。
-
用法:
redis> set foo bar ok redis> bitpos foo 1 (integer) 1 redis> bitpos foo 1 1 2 (integer) 9
-
2、散列类型
简介
散列类型的键值也是一种字典结构,其存储了字段(field)和字段值的映射,但字段值只能是字符串,不支持其他数据类型,换句话说,散列类型不支持嵌套其他的数据类型。一个散列类型键可以包含至多2^32-1个字段。
类似于数据结构中的map
命令
(1)赋值与取值 hset/hget/hmset/hmget/hgetall
hset key field value
hget key field
hmset key field value [field value...]
hmget key field [field...]
hgetall key
-
hget/hset
-
说明:获取字段的值和设置字段的值。
hset
不区分插入和更新操作,当执行插入操作时返回1,执行更新操作时返回0;当键不存在时自动创建。 -
用法:
redis> hset car price 500 (integer) 1 redis> hset car name BMW (integer) 1 redis> hget car name "BMW"
-
-
hmset/hmget
-
说明:设置和获取多个字段值
-
用法:
redis> hset car price 500 name "BMW" (integer) 1 redis> hmget car name price 1) "BMW" 2) "500"
-
-
hgetall
-
说明:获取键中所有字段和字段值
-
用法
redis> hset car price 500 name "BMW" (integer) 1 redis> hgetall car 1) "price" 2) "500" 3) "name" 4) "BMW"
-
(2)判断字段是否存在 hexists
hexists key field
-
说明:判断字段是否存在,存在返回1,不存在返回0(键不存在也返回0)
-
用法:
redis> hset car price 500 name "BMW" (integer) 1 redis> hexists car model (integer) 0 redis> hset car model C200 (integer) 1 redis> hexists car model (integer) 1
(3)当字段不存在时赋值 hsetnx
hsetnx key field value
-
说明:
hsetnx
和hset
命令类似,区别在于如果字段已经存在,hsetnx
命令将不执行任何操作。 -
用法:
redis> hset car name "bmw" (integer) 1 redis> hget car name "bmw" redis> hsetnx car name "BMW" (intger) 0 redis> hget car name "bmw" redis> hsetnx car price 100 (integer) 1 redis> hget car price "100"
(4)增加数字 hincrby
hincrby key field increment
-
说明:使指定字段值增加指定的整数。字段不存在,会自动建立并赋值为0
-
用法:
redis> hset car price 100 (integer) 1 redis> hincrby car price 60 (integer) 160 redis> hget car price "160"
(5)删除字段 hdel
hdel key field [field...]
-
说明:删除一个或多个字段,返回值是被删除的字段个数
-
用法:
redis> hset car price 500 name "BMW" (integer) 1 redis> hdel car price (integer) 1 redis> hdel car price (integer) 0
(6)只获取字段名或字段值 hkeys/kvals
hkeys key
hvals key
-
说明:获取所有字段值或者字段名
-
用法:
redis> hset car price 500 name "BMW" (integer) 1 reids> hkeys car 1) "price" 2) "name" redis> hvals car 1) "500" 2) "BMW"
(7)获得字段数量 hlen
hlen key
-
说明:获取字段数量
-
用法:
redis> hset car price 500 name "BMW" (integer) 1 redis> hlen car (integer) 2
3、列表类型
简介
- 列表类型(list)可以存储一个有序的字符串列表,常用操作是向列表两端添加元素,或者获得列表的某一个片段。
- 列表类型内部使用的是一个双向链表实现的。
- 一个列表类型键最多能容纳2^32-1个元素
命令
(1)向列表两端添加元素 lpush/rpush
lpush key value [value...]
rpush key value [value...]
-
说明:向列表的两端添加元素,返回值是添加后列表的长度
-
用法:
redis> lpush numbers 1 (integer) 1 redis> lpush numbers 2 3 (integer) 3 redis> lrange number 0 -1 1) "3" 2) "2" 3) "1"
(2)从列表两端弹出元素 lpop/rpop
lpop key
rpop key
-
说明:从列表两端弹出元素,返回值为弹出元素
-
用法:
redis> lpush numbers 1 2 3 (integer) 3 redis> lpop numbers "3" redis> rpop numbers "1"
(3)获取列表中元素个数 llen
llen key
-
说明:获取列表中元素个数,当键不存在时返回0
-
用法:
redis> lpush numbers 1 2 3 (integer) 3 redis> llen numbers (integer) 3
(4)获得列表片段 lrange
lrange key start end
-
说明:
- 获取列表的某一片段。
lrange
命令将返回索引从start到stop之间的所有元素,Redis的列表起始索引为0。Redis支持负索引,-1表示倒数第一个,-2表示倒数第二个。。。 - 如果start的索引位置比stop的位置靠后,则会返回空列表;如果stop大于实际索引范围,则会返回到列表最右边的元素
- 获取列表的某一片段。
-
用法:
redis> lpush numbers 1 2 3 4 5 (integer) 5 redis> lrange numbers 0 2 1) "5" 2) "4" 3) "3" redis> lrange numbers -2 -1 1) "2" 2) "1"
(5)获得/设置指定索引的元素值 lindex/lset
lindex key index
lset key index value
-
说明:
lindex
用来返回指定索引的元素,索引从0开始。lset
将索引为index的元素赋值为value -
用法:
redis> lpush numbers 1 2 3 4 5 (integer) 5 redis> lindex numbers 2 "3" redis> lindex numbers -1 "1" redis> lset numbers 1 7 ok redis> lindex numbers 1 "7"
(6)只保留列表指定片段 ltrim
ltrim key start end
-
说明:删除指定索引范围之外的所有元素,其指定列表范围的方法和
lrange
相同 -
用法:
redis> lpush numbers 1 2 3 4 5 (integer) 5 redis> ltrim numbers 1 2 ok redis> lrange numbers 0 -1 1) "4" 2) "3"
(7)向列表中插入元素 linsert
-
说明:
linsert
首先会从列表从左到右查找值为pivot的元素,然后根据第二个参数是before还是after来决定将value插入到该元素的前面还是后面,返回值是插入后列表的元素个数 -
用法:
redis> lpush numbers 1 2 3 4 5 (integer) 5 redis> linsert numbers after 4 3 1) "5" 2) "4" 3) "3" 4) "3" 5) "2" 6) "1"
(8)将元素从一个列表转到另一个列表 rpoplpush
rpoplpush soucre destination
-
说明:将一个列表的元素转移到另一个列表。一次只移动一个元素
-
用法:
redis> lpush number1 1 2 (integer) 2 redis> lpush number2 3 4 (integer) 2 redis> rpoplpush number1 number2 "1" redis> lrange number1 0 -1 1) "2" redis> lrange number2 0 -1 1) "1" 2) "4" 3) "3"
4、结合类型
简介
集合中的每个元素是不相同的,且没有顺序。一个集合类型(set)键可以存储至多2^32-1个字符串
命令
(1)增加/删除元素 sadd/srem
sadd key member [member..]
srem key member [member..]
-
说明:
sadd
用来向集合中添加一个或多个元素,如果键不存在则会创建。如果插入已存在的值则会忽略这个元素。返回插入成功的元素数量srem
用来从集合中删除一个或多个元素,并返回删除成功的个数
-
用法:
redis> sadd letters a (integer) 1 redis> sadd letters a b c (integer) 2 redis> srem letters c d (integer) 1
(2)获得集合中所有元素 smembers
smembers key
-
说明:返回集合中的所有元素
-
用法:
redis> sadd letters a b (integer) 2 redis> smembers letters 1) "a" 2) "b"
(3)判断元素是否在集合中 sismember
sismember key member
-
说明:判断元素是否再集合中。存在时返回1,不存在时返回0
-
用法:
redis> sadd letters a b redis> sismember letters a (integer) 1 redis> sismember letters d (integer) 0
(4)集合间运算 sdiff/sinter/sunion/sdiffstore
sdiff key [key...] # 差集
sinter key [key...] # 交集
sunion key [key...] # 并集
sdiffstore destination key [key...] # 进行集合运算并将结果存储
(5)获得集合中元素个数 scard
scard key
-
说明:获取集合中元素个数
-
用法:
redis> sadd letters a b (integer) 2 redis> scard letters (integer) 2
(6)随机获得集合中的元素 srandmember
srandmember key [count]
- 说明:用来随机从集合中获取一个元素。可以传递count来一次获取多个元素,根据count的正负不同,具体表现也不同
- count>0,随机获取count个不重复的元素,如果count大于集合中元素个数,则返回全部元素
- count<0,随机获取|count|个可能相同的元素
(7)从集合中弹出一个元素 spop
spop key
- 说明:由于集合是无序的,所以随机弹出一个元素
5、有序结合类型
简介
有序集合在集合的基础上为集合中的每个元素关联了一个分数,集合元素不同,但分数可以相同。有序集合是使用散列表和跳跃表实现的,整个有序集合是有序的。
命令
(1)增加元素 zadd
zadd key socre member [scroe member...]
-
说明:用来向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换旧的分数。返回新加入到集合中的元素个数。分数不仅可以是整数,也可以是双进度浮点数,无穷大(-inf,+inf)
-
用法:
redis> zadd socreboard 89 Tom 67 Peter 100 David (integer) 3
(2)获得元素分数 zscore
zscore key member
-
说明:获得元素分数
-
用法:
redis> zadd socreboard 89 Tom 67 Peter 100 David (integer) 3 redis> zscore scoreboard Tom "89"
(3)获得排名在某个范围的元素列表 zrange/zrevrange
zrange key start stop [withscore]
zrevrange key start stop [withscore]
- 说明:
zrange
命令会按照分数从小到大的顺序返回索引从start到stop之间所有元素(包含两端元素)。支持负数索引zrevrange
命令按照从大到小的顺序获取
(4)获得指定分数范围的元素 zrangebyscore
zrangebyscore key min max [withscores] [limit offset count]
- 描述:按照元素分数从小到大的顺序返回分数在min和max之间(包含min和max)的元素。如果希望不包含端点值,可使用“(”符号,如“(min max”。min和max还支持无穷大(-inf和+inf)。还可以选择获取的数目,使用limit,和SQL语法差不多
(5)增加某个元素的分数 zincrby
incrby key increment member
- 描述:增加一个元素的分数,返回值是更改后的分数。如果指定元素不存在,则会新建并将分数赋值为0,然后执行增加操作
(6)获得集合中元素的数量 zcard
zcard key
- 描述:获得集合中元素的数量
(7)获得指定分数范围内的元素个数 zcount
zcount key min max
- 描述:
zcount
命令中的min和max参数特性和zrangebyscore
一样
(8)删除一个或多个元素 zrem
zrem key member [member...]
- 描述:删除一个或多个元素
(9)按照排名范围删除元素 zremrangebyrank
zrenrangebyrank key start stop
- 描述:按照元素分数从小到大的顺序(索引从0开始)删除处在指定排名范围内的所有元素,并返回删除的元素数量
(10)按照分数范围删除元素 zremrangebyscore
zremrangebyscore key min max
- 描述:删除指定分数范围内的所有元素,参数min和max的特性和
zrangebyscore
命令中的一样。返回值是删除元素的数量
(11)获得元素排名 zrank/zrevrank
zrank key member
zrevrank key member
- 描述:
zrank
会按照元素分数从小到大的顺序获得指定元素的排名(名次从0开始)。zrevrank
与zrank
相反
(12)计算有序集合的交集 zinterstore
zinterstore destination numkeys key [key...] [WEIGHTS weight [weight...]] [AGGREGATE SUM|MIN|MAX]
- 描述:用来计算多个有序集合的交集并将结果存储在destination键中(同样以有序集合类型存储),返回值为destination键中的元素个数
转载:https://blog.csdn.net/z1762861794/article/details/105938239