目录
数据类型
(操作多 ,主要掌握对不同类型数据的管理命令)
在数据是通过程序员写网站脚本存储在 redis 服务器的内存里。
数据库运维需要对存储在服务器内存里的数据做管理,
管理包括: 查看 修改 删除 存储新数据 ,不同类型的数据要使用对应的命令管理
redis服务支持的数据类型如下:
1) 字符类型( string) 字符串 可以是英文字母 或 汉字
2) 列表类型 (list) 一个变量名 存储多个数据 (类似于shell脚本语言的数组)
3)Hash 类型 (hash) 一个变量里可以存储多列 每列对应一个值
4)集合类型 也是让一个变量可以存储多个数据 (和python 语言集合类型是一个意思)
集合分为有序集合类型(zset) 和 无序集合类型( set)
工作如何对程序存储在内存里的数据做管理
第1步 查看变量是否存在 192.168.4.56:6356> EXISTS NAME (integer) 0 表示不存在 192.168.4.56:6356> EXISTS age (integer) 1 表示变量存在 第2步 查看数据类型 (知道数据类型后,才能明确用来管理命令) 注意: 每种类型的数据都是用固定的关键字表示 192.168.4.56:6356> type age string 192.168.4.56:6356> 第3步:掌握每种类型数据对应的管理命令 操作命令包括: 变量赋值 查看变量值 修改变量值 输出变量值 |
数据类型的使用
字符类型 string
- 字符串类型是 Redis 中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据
- 可以用其存储用户的邮箱、JSON 化的对象甚至是一张图片
- 一个字符串类型键允许存储的数据的最大容量是512 MB
- 字符串类型是其他4种数据类型的基础,其他数据类型和字符串类型的差别从某种角度来说只是组织字符串的形式不同
操作命令
- 赋值命令
# 赋值 SET key value
# 取值 GET key
案例:
127.0.0.1:6379> SET username tom
OK
127.0.0.1:6379> GET username
"tom"
127.0.0.1:6379> GET password # 当键不存在时会返回空结果。
(nil)
设置变量的有效期 px(毫秒) ex (秒)
192.168.4.51:6379> set name plj ex 10
OK
192.168.4.51:6379> set name plj px 10
OK
NX 变量不存在是赋值 如果存在就放弃赋值
192.168.4.51:6379> set name plj NX
OK
192.168.4.51:6379> get name
"plj"
XX 变量存在时赋值 如果不存在放弃赋值
192.168.4.51:6379> set name yaya XX
OK
192.168.4.51:6379> get name
"yaya"
递增数字:
字符串类型可以存储任何形式的字符串,当存储的字符串是整数形式时,
Redis 提供了一个实用的命令 INCR,其作用是让当前键值递增,并返回递增后的值。
当要操作的键不存在时会默认键值为0,所以第一次递增后的结果是1。
127.0.0.1:6379> INCR num
(integer) 1
127.0.0.1:6379> INCR num
(integer) 2
127.0.0.1:6379> GET num
"2"
- 当键值不是整数时Redis会提示错误
127.0.0.1:6379> SET foo bar
OK
127.0.0.1:6379> INCR foo
(error) ERR value is not an integer or out of range
递减数字
127.0.0.1:6379> DECR num
(integer) 5
127.0.0.1:6379> DECRBY num 2
(integer) 3
向尾部追加值
127.0.0.1:6379> SET hi Hello
OK
127.0.0.1:6379> APPEND hi " World" # 因为字符串包含空格,需要使用引号
(integer) 11 # 返回值为hi的总长度
127.0.0.1:6379> GET hi
"Hello World"
获取字符串长度
127.0.0.1:6379> STRLEN hi
(integer) 11
- 中文字符返回字节数
127.0.0.1:6379> SET name 张三
OK
127.0.0.1:6379> STRLEN name
(integer) 6 # UTF-8编码的中文,由于“张”和“三”两个字的UTF-8编码的长度都是3,所以此例中会返回6。
获取变量部分数据
192.168.4.53:6379> set zfc ABCEF
OK
192.168.4.53:6379> GET zfc
"ABCEF"
192.168.4.53:6379> GETRANGE zfc 0 1
"AB"
192.168.4.53:6379> GETRANGE zfc 2 4
"CEF"
192.168.4.53:6379> GETRANGE zfc -2 -1
"EF"
散列类型
- 散列类型(hash)的键值也是一种字典结构,其存储了字段(field)和字段值的映射
- 字段值只能是字符串
- 散列类型适合存储对象。使用对象类别和 ID 构成键名,使用字段表示对象的属性,而字段值则存储属性值
操作命令
赋值与取值
127.0.0.1:6379> HSET user1 name bob
(integer) 1
127.0.0.1:6379> HSET user1 gender male
(integer) 1
127.0.0.1:6379> HGET user1 name
"bob"
127.0.0.1:6379> HGET user1 gender
"male"
设置多个字段
127.0.0.1:6379> HMSET user1 email bob@tedu.cn phone 13412345678
OK
127.0.0.1:6379> HMGET user1 email phone
1) "bob@tedu.cn"
2) "13412345678"
获取所有字段
127.0.0.1:6379> HGETALL user1
1) "name"
2) "bob"
3) "gender"
4) "male"
5) "email"
6) "bob@tedu.cn"
7) "phone"
8) "13412345678"
判断字段是否存在
127.0.0.1:6379> HEXISTS user1 address
(integer) 0
127.0.0.1:6379> HEXISTS user1 name
(integer) 1
数字递增
127.0.0.1:6379> HINCRBY user1 age 20
(integer) 20
127.0.0.1:6379> HINCRBY user1 age 1
(integer) 21
删除字段
127.0.0.1:6379> HDEL user1 age
(integer) 1
只获取字段名
127.0.0.1:6379> HKEYS user1
1) "name"
2) "gender"
3) "email"
4) "phone"
5) "address"
只获取值
127.0.0.1:6379> HVALS user1
1) "bob"
2) "male"
3) "bob@tedu.cn"
4) "13412345678"
5) "beijing"
获得字段数量
127.0.0.1:6379> HLEN user1
(integer) 5
列表类型
- 列表类型(list)可以存储一个有序的字符串列表
- 常用的操作是向列表两端添加元素,或者获得列表的某一个片段
- 列表类型内部是使用双向链表(double linked list)实现的,获取越接近两端的元素速度就越快
- 使用链表的代价是通过索引访问元素比较慢
- 这种特性使列表类型能非常快速地完成关系数据库难以应付的场景:如社交网站的新鲜事,我们关心的只是最新的内容,使用列表类型存储,即使新鲜事的总数达到几千万个,获取其中最新的100条数据也是极快的
操作命令
LPUSH命令用来向列表左边增加元素,返回值表示增加元素后列表的长度
127.0.0.1:6379> LPUSH numbers 1
(integer) 1
127.0.0.1:6379> LPUSH numbers 2 3
(integer) 3
127.0.0.1:6379> RPUSH numbers 0 -1
(integer) 5
127.0.0.1:6379> LRANGE numbers 0 -1
1) "3"
2) "2"
3) "1"
4) "0"
5) "-1"
取出列表所有元素
127.0.0.1:6379> LRANGE numbers 0 -1 # 起始下标为0,结束下标为-1
1) "3"
2) "2"
3) "1"
从列表两端弹出元素
127.0.0.1:6379> LPOP numbers
"3"
127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
4) "-1"
127.0.0.1:6379> RPOP numbers
"-1"
127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
获取列表中元素的个数
127.0.0.1:6379> LLEN numbers
(integer) 3
插入元素
# 在2的前面插入20
127.0.0.1:6379> LINSERT numbers BEFORE 2 20
(integer) 4
127.0.0.1:6379> LRANGE numbers 0 -1
1) "20"
2) "2"
3) "10"
4) "2"
集合类型
- 集合中的每个元素都是不同的,且没有顺序
- 增加/删除元素
127.0.0.1:6379> SADD letters a b c
(integer) 3
127.0.0.1:6379> SADD letters b c d
(integer) 1
127.0.0.1:6379> SMEMBERS letters
1) "d"
2) "b"
3) "a"
4) "c"
127.0.0.1:6379> SREM letters a c
(integer) 2
127.0.0.1:6379> SMEMBERS letters
1) "d"
2) "b"
判断元素是否在集合中
127.0.0.1:6379> sismember letters a
(integer) 0
127.0.0.1:6379> sismember letters b
(integer) 1
集合运算
192.168.4.51:6379> sadd s1 a b c
(integer) 3
192.168.4.51:6379> sadd s2 b c d
(integer) 3
192.168.4.51:6379> SINTER s1 s2
1) "c"
2) "b"
127.0.0.1:6379> SUNION s1 s2
1) "a"
2) "c"
3) "b"
4) "d"
127.0.0.1:6379> SDIFF s1 s2
1) "a"
获得集合中元素个数
127.0.0.1:6379> SCARD letters
(integer) 2
随机获得集合中的元素
在集合s1中随机取出两个不同元素。
127.0.0.1:6379> SRANDMEMBER s1 2
1) "b"
2) "c"
在集合s1中随机取出两个有可能相同元素。
127.0.0.1:6379> SRANDMEMBER s1 -2
1) "c"
2) "c"
集合中随机弹出一个元素
127.0.0.1:6379> SPOP s1
"a"
有序集合类型
- 在集合类型的基础上有序集合类型为集合中的每个元素都关联了一个分数
- 这使得我们不仅可以完成插入、删除和判断元素是否存在等集合类型支持的操作,还能够获得分数最高(或最低)的前N个元素、获得指定分数范围内的元素等与分数有关的操作
- 虽然集合中每个元素都是不同的,但是它们的分数却可以相同。
- 有序集合类型在某些方面和列表类型有些相似
- 二者都是有序的
- 二者都可以获得某一范围的元素
- 有序集合类型和列表也有着很大的区别,这使得它们的应用场景也是不同的
- 列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会较慢,所以它更加适合实现如“新鲜事”或“日志”这样很少访问中间元素的应用
- 有序集合类型是使用散列表和跳跃表(Skip list)实现的,所以即使读取位于中间部分的数据速度也很快
- 列表中不能简单地调整某个元素的位置,但是有序集合可以(通过更改这个元素的分数)
- 有序集合要比列表类型更耗费内存
有序集合类型操作
- ZADD 命令用来向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。
ZADD命令的返回值是新加入到集合中的元素个数
127.0.0.1:6379> ZADD scores 88 tom 90 jerry 75 bob 92 alice
(integer) 4
127.0.0.1:6379> ZRANGE scores 0 -1
1) "bob"
2) "tom"
3) "jerry"
4) "alice"
127.0.0.1:6379> ZRANGE scores 0 -1 WITHSCORES
1) "bob"
2) "75"
3) "tom"
4) "88"
5) "jerry"
6) "90"
7) "alice"
8) "92"
127.0.0.1:6379> ZADD scores 85 jerry
(integer) 0
127.0.0.1:6379> ZRANGE scores 0 -1 WITHSCORES
1) "bob"
2) "75"
3) "jerry"
4) "85"
5) "tom"
6) "88"
7) "alice"
8) "92"
获得元素的分数
127.0.0.1:6379> ZSCORE scores tom
"88"
获得指定分数范围的元素
127.0.0.1:6379> ZRANGEBYSCORE scores 80 90 WITHSCORES
1) "jerry"
2) "85"
3) "tom"
4) "88"
增加某个元素的分数
127.0.0.1:6379> ZINCRBY scores 3 bob
"78"
127.0.0.1:6379> ZSCORE scores bob
"78"
获得集合中元素的数量
127.0.0.1:6379> ZCARD scores
(integer) 4
获得指定分数范围内的元素个数
127.0.0.1:6379> ZCOUNT scores 80 90
(integer) 2
删除元素
127.0.0.1:6379> ZREM scores bob
(integer) 1
获得元素的排名
127.0.0.1:6379> ZRANK scores tom # 获取tom的排名
(integer) 1 # 升序排列,从0开始计数
127.0.0.1:6379> ZREVRANK scores alice # 获取alice的排名
(integer) 0 # 降序排列,从0开始计数