文章目录
一:Redis支持的五种数据类型
- string(字符串)
- hash(哈希)
- list(列表)
- set(集合)
- zset(sorted set:有序集合)
二:五种数据类型的简单介绍及操作演示
2.1:string
- string是redis最基本的数据类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value.
- string类型是二进制安全的。redis的string 可以包含任何数据。比如jpg图片或者序列化的对象。
- string类型是Redis最基本的数据类型,string类型的值最大能存储512MB。
- 操作演示
20.0.0.111:6379> set name zhangsan
OK
20.0.0.111:6379> get name
"zhangsan"
2.2:HASH(哈希字典)
-
Redis hash是一个键值(key= >value)对集合。
-
Redis hash是一个string类型的field和value的映射表,hash 特别适合用于存储对象。
-
每个hash可以存储2的32次方-1键值对。
-
作用场景
- 键值对集合,即编程语言中的Map类型
- 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值
-
操作演示
20.0.0.111:6379> hmset stu name lisi age 18 sex 男
OK
20.0.0.111:6379> hget stu name
"lisi"
20.0.0.111:6379> hget stu age
"18"
20.0.0.111:6379> hget stu sex
"\xe7\x94\xb7" ###这里的中文字符出现乱码
20.0.0.111:6379> quit
[root@localhost utils]# redis-cli -h 20.0.0.111 -p 6379 --raw #--raw 解决中文乱码的问题
20.0.0.111:6379> hget stu sex
男
2.3:list(列表)
-
Redis列表是简单的字符串列表,按照插入顺序排序,可以重复。
-
可以添加一个元素到列表的头部(左边)或者尾部(右边)
-
列表最多可存储2的32次方- 1元素。
-
作用场景
- 增删快,提供了操作某-段元索的API
- 最新消息排行等功能(比如朋友圈的时间线)
- 消息队列
[root@redis ~]# redis-cli -h 20.0.0.111 -p 6379
20.0.0.111:6379> lpush hobby play
(integer) 1
20.0.0.111:6379> lpush hobby read
(integer) 2
20.0.0.111:6379> lpush hobby sport
(integer) 3
20.0.0.111:6379> lrange hobby 0 10 ####读取数据顺序从最后存储进去的数据开始反向读
1) "sport"
2) "read"
3) "play"
20.0.0.111:6379>
20.0.0.111:6379> lpush hobby play
(integer) 4
20.0.0.111:6379> lrange hobby 0 10
1) "play" ###元素可以重复
2) "sport"
3) "read"
4) "play"
20.0.0.111:6379>
2.4:set(集合)
-
Redis的Set是string类型的无序集合。
-
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是0(1)。
-
作用场景
- 共同好友
- 利用唯一性,统计访问网站的所有独立ip
- 好友推荐时,根据tag求交集,大于某个阈值就可以推荐
-
sadd命令
- 添加一个string元素到key对应的set集合中,成功返回1,如果元素已经在集合中返回0。
-
操作演示
20.0.0.111:6379> sadd color red green yellow
(integer) 3
20.0.0.111:6379> smembers color
1) "green"
2) "yellow"
3) "red"
20.0.0.111:6379> sadd color red
(integer) 0 ###元素不可重复,返回失败状态吗‘0’
20.0.0.111:6379>
2.5:zset(sorted set:有序集合)
-
Redis zset和set 一样也是string类型元素的集合,且不允许重复的成员。
-
不同的是每个元素都会关联一个double类型的分数。
-
redis正是通过分数来为集合中的成员进行从小到大的排序。
-
zset的成员是唯一的,但分数(score)却可以重复。
-
作用场景:
- 将Set中的元素增加一个权重参数score,元素按score有序排列
- 数据插入集合时,已经进行天然排序
- 例如:1.排行榜 2.带权重的消息队列
-
zadd命令
- 添加元素到集合,元素在集合中存在则更新对应score
操作演示
- 添加元素到集合,元素在集合中存在则更新对应score
20.0.0.111:6379> zadd cool 0 red
(integer) 1
20.0.0.111:6379> zadd cool 0 blue
(integer) 1
20.0.0.111:6379> zadd cool 1 green
(integer) 1
20.0.0.111:6379> zadd cool 1 yellow
(integer) 1
20.0.0.111:6379> zadd cool 2 pink
20.0.0.111:6379> zrangebyscore cool 0 10
1) "blue"
2) "red"
3) "green"
4) "yellow"
5) "pink"
20.0.0.111:6379> zrangebyscore cool 0 0
1) "blue"
2) "red"
20.0.0.111:6379> zrangebyscore cool 1 1
1) "green"
2) "yellow"
20.0.0.111:6379> zadd cool 1.5 black ###这里插入一个序号为1.5的元素
(integer) 1
20.0.0.111:6379> zrangebyscore cool 0 10
1) "blue"
2) "red"
3) "green"
4) "yellow"
5) "black" ###可以看到它是按照序号进行有序排序的
6) "pink"
20.0.0.111:6379>
20.0.0.111:6379> type cool
zset
20.0.0.111:6379>
三:多数据库的概念
3.1:多数据库的简介及操作演示
- Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念。
- Redis是-个字典结构的存储服务器,而实际上-个Redis实例提供了 多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。这与我们熟知的在一个关系数据库实例中可以创建多个数据库似,所以可以将其中的每个字典都理解成一个独立的数据库。
- 每个数据库对外都是一个从0开始的递增数字命名,Redis默认支持16个数据库(可以通过配置文件支持更多,无上限) ,可以通过配置databases来修改这一数字. 客户端与Redis建立连接后会自动选择0号数据库,不过可以随时使用SELECT命令更换数据库,如要选择1号数据库:
20.0.0.111:6379> keys * ###0号数据库
1) "cool"
2) "color"
3) "hobby"
20.0.0.111:6379> select 1
OK
20.0.0.111:6379[1]> keys *
(empty list or set) ###由于它是从0数据库开始存储的,所以这里切换到1号数据库显示为空
20.0.0.111:6379[1]> set name zhangsan
OK ###重新写入元素,查看只有一个元素,证明它数据库之间相互隔离
20.0.0.111:6379[1]> keys *
1) "name"
20.0.0.111:6379[1]> get name
"zhangsan"
20.0.0.111:6379[1]>
20.0.0.111:6379[1]> flushall ###清空所有数据库
OK
20.0.0.111:6379[1]> select 0
OK
20.0.0.111:6379> keys *
(empty list or set)
20.0.0.111:6379> select 1
OK
20.0.0.111:6379[1]> keys *
(empty list or set)
20.0.0.111:6379[1]>
3.2:注意
-
Redis不支持自定义数据库的名字,每个数据库都以编号命名,开发者必须自己记录哪些数据库存储了哪些数据。
-
另外Redis也不支持为每个数据库设置不同的访问密码,所以一个客户端要么可以访问全部数据库,要么连一个数据库也没有权限访问。
-
最重要的一点是多个数据库之间并不是完全隔离的,比如FLUSHALL命令可以清空-个Redis实例中所有数据库中的数据。
-
综上所述,这些数据库更像是一种命名空间,而不适宜存储不同应用程序的数据。
-
作用场景:
- 可以使用0号数据库存储某个应用生产环境中的数据,使用1号数据库存储测试环境中的数据,
但不适宜使用0号数据库存储A应用的数据而使用1号数据库B应用的数据,不同的应用应该使用不同的Redis实例存储数据。 - 由于Redis非常轻量级,一个空Redis实例占用的内存只有1 M左右,所以不用担心多个Redis实例会额外占用很多内存。
- 可以使用0号数据库存储某个应用生产环境中的数据,使用1号数据库存储测试环境中的数据,
3.3:key常规管理
- 验证key是否存在 exists
20.0.0.111:6379> set name zhangsan
OK
20.0.0.111:6379> exists name
(integer) 1
20.0.0.111:6379> exists names
(integer) 0
20.0.0.111:6379>
- 重命名 rename
20.0.0.111:6379> rename name na
OK
20.0.0.111:6379> get na
"zhangsan" ###可以看到重命名只是改变了key的名字,里面的值并没有发生改变
20.0.0.111:6379>
- 设置超时时间 PEXPIRE (单位:毫秒)
20.0.0.111:6379> pexpire na 3000
(integer) 1
20.0.0.111:6379> get na
(nil) ###超时以后元素清空
20.0.0.111:6379>
- 查看剩余时间 PTTL (单位:毫秒)
20.0.0.111:6379> set name zhangsan
OK
20.0.0.111:6379> pttl name
(integer) -1 ###默认为-1,表示永不超时
20.0.0.111:6379>
20.0.0.111:6379> pexpire name 30000
(integer) 1
20.0.0.111:6379> pttl name
(integer) 17948
20.0.0.111:6379>
- 取消超时时间 PERSIST
20.0.0.111:6379> pttl name
(integer) -1
20.0.0.111:6379> keys *
1) "name"
20.0.0.111:6379> pexpire name 30000
(integer) 1
20.0.0.111:6379> pttl name
(integer) 20285
20.0.0.111:6379> persist name
(integer) 1
20.0.0.111:6379> pttl name
(integer) -1 ###取消超时时间后又返回默认值-1
20.0.0.111:6379>
- 查看数据类型 TYPE
20.0.0.111:6379> type color
list
20.0.0.111:6379> type name
string
20.0.0.111:6379> mset age 18 sore 88 sex boy
OK
20.0.0.111:6379> type sex
string
20.0.0.111:6379>
- 随机返回key RANDOMKEY
20.0.0.111:6379> randomkey
"age"
20.0.0.111:6379> randomkey
"name"
20.0.0.111:6379> randomkey
"color"
20.0.0.111:6379> randomkey
"color"