Redis
@Author:hanguixian
@Email:hn_hanguixian@163.com
三 Redis数据类型
1 Redis的五大数据类型
1.1 string(字符串)
- string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
- string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
- string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M
1.2 hash(哈希,类似java里的Map)
- Redis hash 是一个键值对集合。
- Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
- 类似Java里面的Map<String,Object>
1.3 List(列表)
- Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。
- 它的底层实际是个链表
1.4 Set(集合)
- Redis的Set是string类型的无序集合。它是通过HashTable实现实现的
1.5 zset(sorted set:有序集合)
- Redis的zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
- 不同的是每个元素都会关联一个double类型的分数。
- redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。
2 常见数据类型操作命令
3 Redis 键(key)
3.1 常用命令
- keys *
- exists key的名字,判断某个key是否存在
- move key db —>当前库就没有了,被移除了
- expire key 秒钟:为给定的key设置过期时间
- ttl key 查看还有多少秒过期,-1表示永不过期,-2表示已过期
- type key 查看你的key是什么类型
- 详情参考:http://redisdoc.com/key/index.html
3.2 示例
[root@xxxmmm bin]# redis-server /hanguixian/myredis/redis.conf
14897:C 27 Nov 2018 17:32:46.353 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
14897:C 27 Nov 2018 17:32:46.353 # Redis version=5.0.0, bits=64, commit=00000000, modified=0, pid=14897, just started
14897:C 27 Nov 2018 17:32:46.353 # Configuration loaded
[root@xxxmmm bin]# redis-cli
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> KEYS *
1) "k1"
127.0.0.1:6379> EXISTS k1
(integer) 1
127.0.0.1:6379> EXISTS k2
(integer) 0
127.0.0.1:6379> move k1 2
(integer) 1
127.0.0.1:6379> KEYS *
(empty list or set)
127.0.0.1:6379> SELECT 2
OK
127.0.0.1:6379[2]> KEYS *
1) "k1"
127.0.0.1:6379[2]> SELECT 0
OK
127.0.0.1:6379> KEYS *
(empty list or set)
127.0.0.1:6379> set k02 v02
OK
127.0.0.1:6379> KEYS *
1) "k02"
127.0.0.1:6379> EXPIRE k02 10
(integer) 1
127.0.0.1:6379> ttl k02
(integer) 2
127.0.0.1:6379> ttl k02
(integer) 0
127.0.0.1:6379> EXPIRE k02 10
(integer) 0
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set k03 v03
OK
127.0.0.1:6379> type k03
string
127.0.0.1:6379> type v03
none
127.0.0.1:6379> type set01
set
127.0.0.1:6379> ttl set01
(integer) -1
4 Redis字符串(String)
- 单值单value
4.1 常用命令
- set/get/del/append/strlen
- set:将字符串值
value
关联到key
。 - get:返回
key
所关联的字符串值。 - del:删除给定的一个或多个
key
。不存在的key
会被忽略。 - append:如果
key
已经存在并且是一个字符串, APPEND 命令将value
追加到key
原来的值的末尾。 如果key
不存在, APPEND 就简单地将给定key
设为value
,就像执行SET key value
一样。 - strlen:返回
key
所储存的字符串值的长度。
- Incr/decr/incrby/decrby,一定要是数字才能进行加减
- Incr:将
key
中储存的数字值增一。 - decr:将
key
中储存的数字值减一。 - incrby:将
key
所储存的值加上增量increment
。 - decrby:将
key
所储存的值减去减量decrement
。
- getrange/setrange
- getrange:返回
key
中字符串值的子字符串,字符串的截取范围由start
和end
两个偏移量决定(包括start
和end
在内)。 - setrange:用
value
参数覆写(overwrite)给定key
所储存的字符串值,从偏移量offset
开始。
- setex(set with expire)键秒值/setnx(set if not exist)
- setex:将值
value
关联到key
,并将key
的生存时间设为seconds
(以秒为单位)。 - setnx:将
key
的值设为value
,当且仅当key
不存在。
- mset/mget/msetnx
- mset:同时设置一个或多个
key-value
对。 - mget:返回所有(一个或多个)给定
key
的值。 - msetnx:同时设置一个或多个
key-value
对,当且仅当所有给定key
都不存在。
- getset(先get再set)
- 将给定
key
的值设为value
,并返回key
的旧值(old value)。
4.2 示例
[root@xxxmmm bin]# redis-server /hanguixian/myredis/redis.conf
15038:C 27 Nov 2018 19:49:09.640 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
15038:C 27 Nov 2018 19:49:09.640 # Redis version=5.0.0, bits=64, commit=00000000, modified=0, pid=15038, just started
15038:C 27 Nov 2018 19:49:09.640 # Configuration loaded
[root@xxxmmm bin]# redis-cli
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> append k1 aaaaaa
(integer) 8
127.0.0.1:6379> get k1
"v1aaaaaa"
127.0.0.1:6379> STRLEN k1
(integer) 8
127.0.0.1:6379> INCR k1
(error) ERR value is not an integer or out of range
127.0.0.1:6379> set int01 1
OK
127.0.0.1:6379> INCR int01
(integer) 2
127.0.0.1:6379> INCR int01
(integer) 3
127.0.0.1:6379> INCRBY int01 20
(integer) 23
127.0.0.1:6379> getrange k1 1 5
"1aaaa"
127.0.0.1:6379> SETRANGE k1 1 bbb
(integer) 8
127.0.0.1:6379> get k1
"vbbbaaaa"
127.0.0.1:6379> setex k1 10 555555
OK
127.0.0.1:6379> get k1
"555555"
127.0.0.1:6379> get k1
(nil)
127.0.0.1:6379> mset k2 v2 k3 v3
OK
127.0.0.1:6379> mget k1 k2 k3
1) (nil)
2) "v2"
3) "v3"
127.0.0.1:6379> getset k2 mmmm
"v2"
127.0.0.1:6379> getset k2 uuuu
"mmmm"
127.0.0.1:6379> get k2
"uuuu"
5 Redis列表(List)
- 单值多value
5.1 常用命令
- lpush/rpush/lrange
- lpush:将一个或多个值
value
插入到列表key
的表头 - rpush:将一个或多个值
value
插入到列表key
的表尾(最右边)。 - lrange:返回列表
key
中指定区间内的元素,区间以偏移量start
和stop
指定。
- lpop/rpop
- lpop:移除并返回列表
key
的头元素。 - rpop:移除并返回列表
key
的尾元素。
- lindex,按照索引下标获得元素(从上到下)
- 返回列表
key
中,下标为index
的元素。
- llen
- 返回列表
key
的长度。
- lrem key 删N个value
- 根据参数
count
的值,移除列表中与参数value
相等的元素。
- ltrim key 开始index 结束index,截取指定范围的值后再赋值给key
- ltrim:截取指定索引区间的元素,格式是ltrim list的key 起始索引 结束索引
- rpoplpush 源列表 目的列表
- 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
- lset key index value
- 将列表
key
下标为index
的元素的值设置为value
。
- linsert key before/after 值1 值2
- 在list某个已有值的前后再添加具体值
5.2 示例
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> lpush scope a b 1 2
(integer) 4
127.0.0.1:6379> LRANGE scope 0 -1
1) "2"
2) "1"
3) "b"
4) "a"
127.0.0.1:6379> RPOP scope
"a"
127.0.0.1:6379> LRANGE scope 0 -1
1) "2"
2) "1"
3) "b"
127.0.0.1:6379> lindex scope 2
"b"
5.3 性能总结
- 它是一个字符串链表,left、right都可以插入添加;
- 如果键不存在,创建新的链表;
- 如果键已存在,新增内容;
- 如果值全移除,对应的键也就消失了。
- 链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了。
6 Redis集合(Set)
- 单值多value
6.1 常用命令
- sadd/smembers/sismember
- sadd:将一个或多个
member
元素加入到集合key
当中,已经存在于集合的member
元素将被忽略。 - smembers:返回集合
key
中的所有成员。 - sismember:判断
member
元素是否集合key
的成员。
- scard,获取集合里面的元素个数
- srem key value 删除集合中元素
- 移除集合
key
中的一个或多个member
元素,不存在的member
元素会被忽略。
- srandmember key 某个整数(随机出几个数)
- 从set集合里面随机取出2个
- 如果超过最大数量就全部取出
- 如果写的值是负数,比如-3 ,表示需要取出3个,但是可能会有重复值。
- spop key 随机出栈
- smove key1 key2 在key1里某个值:作用是将key1里的某个值赋给key2
- SMOVE source destination member:将
member
元素从source
集合移动到destination
集合。
- 数学集合类
- 差集:sdiff
- 返回一个集合的全部成员,该集合是所有给定集合之间的差集。
- 交集:sinter
- 返回一个集合的全部成员,该集合是所有给定集合的交集。
- 并集:sunion
- 返回一个集合的全部成员,该集合是所有给定集合的并集。
6.2 示例
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> sadd cc 1 2 3 n n d 1
(integer) 5
127.0.0.1:6379> SMEMBERS cc
1) "2"
2) "n"
3) "3"
4) "d"
5) "1"
127.0.0.1:6379> scard cc
(integer) 5
7 Redis哈希(Hash)
- KV模式不变,但V是一个键值对
7.1 常用命令
- hset/hget/hmset/hmget/hgetall/hdel
- hset:HSET key field value
- 将哈希表
key
中的域field
的值设为value
。
- hget:HGET key field
- 返回哈希表
key
中给定域field
的值。
- hmset:HMSET key field value [field value …]
- 同时将多个
field-value
(域-值)对设置到哈希表key
中。
- hmget:HMGET key field [field …]
- 返回哈希表
key
中,一个或多个给定域的值。
- hgetall:HGETALL key
- 返回哈希表
key
中,所有的域和值。
- hdel:HDEL key field [field …]
- 删除哈希表
key
中的一个或多个指定域,不存在的域将被忽略。
- hlen
- HLEN key
- 返回哈希表
key
中域的数量。
- hexists key 在key里面的某个值的key
- HEXISTS key field
- 查看哈希表
key
中,给定域field
是否存在。
- hkeys/hvals
- hkeys:HKEYS key
- 返回哈希表
key
中的所有域
- hvals:HVALS key
- 返回哈希表
key
中所有域的值。
- hincrby/hincrbyfloat
- hincrby:HINCRBY key field increment
- 为哈希表
key
中的域field
的值加上增量increment
。
- hincrbyfloat:HINCRBY key field increment
- 为哈希表
key
中的域field
的值加上增量increment
。
- hsetnx
- HSETNX key field value
- 将哈希表
key
中的域field
的值设置为value
,当且仅当域field
不存在。
7.2 示例
[root@xxxmmm bin]# redis-cli
127.0.0.1:6379> KEYS *
(empty list or set)
127.0.0.1:6379> hset englishBook price 100
(integer) 1
127.0.0.1:6379> hget englishBook price
"100"
127.0.0.1:6379> hmset englishBook name youtube1 master 89
OK
127.0.0.1:6379> hmget englishBook name master
1) "youtube1"
2) "89"
127.0.0.1:6379> HGETALL englishBook
1) "price"
2) "100"
3) "name"
4) "youtube1"
5) "master"
6) "89"
127.0.0.1:6379> HEXISTS englishBook name
(integer) 1
127.0.0.1:6379> HEXISTS englishBook name1
(integer) 0
127.0.0.1:6379> HKEYS englishBook
1) "price"
2) "name"
3) "master"
127.0.0.1:6379> HVALS englishBook
1) "100"
2) "youtube1"
3) "89"
8 Redis有序集合Zset(sorted set)
8.1 常用命令
- zadd/zrange
- zadd:ZADD key score member [[score member][score member] …]
- 将一个或多个
member
元素及其score
值加入到有序集key
当中。
- zrange:ZRANGE key start stop [WITHSCORES]
- 返回有序集
key
中,指定区间内的成员。
- zrangebyscore key 开始score 结束score
- ZRANGEBYSCORE key min max [WITHSCORES][LIMIT offset count]
- 返回有序集
key
中,所有score
值介于min
和max
之间(包括等于min
或max
)的成员。有序集成员按score
值递增(从小到大)次序排列。
8.2 示例
127.0.0.1:6379> zadd student 100 lili 90 limei 70 lili
(integer) 2
127.0.0.1:6379> ZRANGE student 0 -1
1) "lili"
2) "limei"
127.0.0.1:6379> ZRANGE student 0 -1 WITHSCORES
1) "lili"
2) "70"
3) "limei"
4) "90"