文章目录

  • 一:Redis支持的五种数据类型
  • 二:五种数据类型的简单介绍及操作演示
  • 2.1:string
  • 2.2:HASH(哈希字典)
  • 2.3:list(列表)
  • 2.4:set(集合)
  • 2.5:zset(sorted set:有序集合)
  • 三:多数据库的概念
  • 3.1:多数据库的简介及操作演示
  • 3.2:注意
  • 3.3:key常规管理


一:Redis支持的五种数据类型

  1. string(字符串)
  2. hash(哈希)
  3. list(列表)
  4. set(集合)
  5. 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
    操作演示
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实例会额外占用很多内存。

3.3:key常规管理

  1. 验证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>
  1. 重命名 rename
20.0.0.111:6379> rename name na
OK
20.0.0.111:6379> get na
"zhangsan"   ###可以看到重命名只是改变了key的名字,里面的值并没有发生改变
20.0.0.111:6379>
  1. 设置超时时间 PEXPIRE (单位:毫秒)
20.0.0.111:6379> pexpire na 3000
(integer) 1
20.0.0.111:6379> get na
(nil)   ###超时以后元素清空
20.0.0.111:6379>
  1. 查看剩余时间 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>
  1. 取消超时时间 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>
  1. 查看数据类型 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>
  1. 随机返回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"