Redis的五种数据类型及应用场景

1,数据类型

  • String(字符串,整数,浮点数):做简单的键值对缓存
  • List(列表):储存一些列表类型的数据结构
  • Set(无序集合):交集,并集,差集的操作
  • Hash(包含键值对的无序散列表):结构化的数据
  • Zset(有序集合)(Sorted sets):去重同时也可以排序,
1,String

​ String是redis最基本的数据类型,一个key对应一个value。redis的String可以表示任何数据。比如jpg图像或者序列化对象,String的最大储存值未512MB。

常用命令:

get,set,incr,decr,mget

set:往redis里面输入Key-Value,比如:输入Key为name,Value值为:zhangsan

127.0.0.1:6379> set name zhangsan
OK

get:输入key值,可返回value值

127.0.0.1:6379> get name
"zhangsan"

incr:自增1,比如

127.0.0.1:6379> set age 23
OK
127.0.0.1:6379> incr age
(integer) 24
127.0.0.1:6379> get age
"24"

decr:自减

192.168.119.139:0>decr age 
"23"
192.168.119.139:0>get age
"23"

mget:一次获取多value值。

192.168.119.139:0>mget name age
 1)  "zhangsan"
 2)  "23"

Redis的五种数据类型及应用场景_第1张图片

Redis的五种数据类型及应用场景_第2张图片

2,List

常用命令

lpush,lpop,rpush,rpop,llen

lpush:从列表List的最左边插入一个元素

lpop:从列表List的左边移出一个元素

rpush:从列表List的右边插入一个元素

rpop:从列表List的右边移出一个元素

llen:打印当前列表List的元素个数

192.168.119.139:0>lpush list1 cat
"1"
192.168.119.139:0>lpush list1 n
"2"
192.168.119.139:0>llen list1
"2"
192.168.119.139:0>lpop list1
"n"
192.168.119.139:0>llen list1
"1"

Redis的五种数据类型及应用场景_第3张图片

3,Set

常用命令

sadd,srem,scard,sismember

sadd:往set中添加数据

srem:从set中删除数据

scard:查看set中存在的元素个数

sismember:查看set中是否存在某个数据

192.168.119.139:0>sadd set1 sky
"1"
192.168.119.139:0>sadd set1 a
"1"
192.168.119.139:0>scard set1
"2"
192.168.119.139:0>sismember set a
"0"
192.168.119.139:0>sismember set1 a
"1" 
192.168.119.139:0>srem set1 a
"1"

Redis的五种数据类型及应用场景_第4张图片

4,Hash

常用命令

hget,hset,hmget

hget:通过key值,从hash里取对应的value

hset:往hash里,添加key-value

hmget:一次性获取多个key的value

192.168.119.139:0>hset hset1 name zhangsan
"1"
192.168.119.139:0>hset hset1 namg lisi
"1"
192.168.119.139:0>hset hset1 age 23
"1"
192.168.119.139:0>hmget hset1 name namg age
 1)  "zhangsan"
 2)  "lisi"
 3)  "23"

Redis的五种数据类型及应用场景_第5张图片

5,ZSet

​ 在redis中,set和zset都有元素的集合,都不允许有重复的元素,不同的是,zset的每个元素都会关联一个分数(分数可以重复),redis通过这个分数为集合中的成员进行排序。

常用命令

zadd,zcard,zrange,zrem,zrevrange

zadd:添加数据

192.168.119.139:0>zadd database 5 redis
"1"
192.168.119.139:0>zadd database 3 mysql
"1"
192.168.119.139:0>zadd database 1 mongodb
"1"

Redis的五种数据类型及应用场景_第6张图片

zrem:删除元素

192.168.119.139:0>zrem database redis
"1"

Redis的五种数据类型及应用场景_第7张图片

**zrem:**还可以删除多个数据

192.168.119.139:0>zrem database mysql mongodb
"2"

当删除了database中的所有数据后database都不存在了

192.168.119.139:0>zadd books 1 java
"1"
192.168.119.139:0>zadd books 3 go
"1"
192.168.119.139:0>zadd books 2 php
"1"
192.168.119.139:0>zadd books 5 mysql
"1"

Redis的五种数据类型及应用场景_第8张图片

zcard:查询数据

192.168.119.139:0>zcard books
"4"

zrange:数据排序,根据分数从大到小

withscores表示用分数进行排序,下面命令的0,3表示排序的区间的是第0个到第三个元素

192.168.119.139:0>zrange books 0 3 withscores
 1)  "java"
 2)  "1"
 3)  "php"
 4)  "2"
 5)  "go"
 6)  "3"
 7)  "mysql"
 8)  "5"

zrevrange:数据排序,分数从大到小

192.168.119.139:0>zrevrange books 0 3 withscores
 1)  "mysql"
 2)  "5"
 3)  "go"
 4)  "3"
 5)  "php"
 6)  "2"
 7)  "java"
 8)  "1"
6,五种数据类型的原理

​ redis内部使用一个redisObject对象来表示所有的key和value,redisObject的信息如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dkJoT9Gd-1648872184366)(C:\Users\SIN2\AppData\Roaming\Typora\typora-user-images\image-20220402093553352.png)]

6.1,redis核心对象

​ **type:**用来表示这个redisObject是属于五种数据类型(String,set,list,hash,zset,)的哪一种,比如说type=String表示value储存的是一个普通的字符串。

encoding:表示type的底层数据结构是用什么实现的,比如Java中的list的是有ArrayList来实现的,

List list = new ArrayList();

List list = new LinkedList();

ptr:指向底层数据结构的指针

vm:打开reids的虚拟内存功能,此字段才回真正的分配内存,该功能是默认关闭的。

6.2,redisObject如何表示String(各个encoding方式解释)

​ 字符串的encoding有三种方式:

  • int
  • raw
  • embstr

int

​ 如果一个字符串String保存的是整数值,如:set age 13,那么这个整数值可以用long类型标识。那么该字符串的redisObject回把13这个整数值保存在ptr属性中,并将encoding设置为int,

raw

​ 如果字符串String保存的是一个字符串值,并且字符串大于39个字节,那么这个字符串对象将使用一个

简单动态字符串(SDS)来保存这个字符串,并将redisObject的encoding设置为raw

embstr

​ 如果字符串String保存的是一个字符串值,并且字符串小于39个字节那么字符串将使用embstr编码的方式来储存这个字符串。

embstr对别raw的优点:

  • embast创建字符串对象(redisObject)的次数只需要一次,而raw是两次(redisObjcet和sds分开分配)
  • embast调用释放内存的函数一次,rew编码的字符串对象要少一次
  • 由于embast编码是内存的连续性的,而raw不是连续的,因此embast存,取是的速度比较快

6.3,redisObject如何标识List

​ 列表对象list的编码方式encoding有两种,ziplist,linkedlist

ziplist(压缩列表)

​ 压缩列表是节省内存而设计的内存结构(是redis创建的),

​ 优点:

  • 节省内存

    缺点:

  • 比其他结构要消耗跟多的时间,所以redis在数据量少的时候使用压缩列表储存。

​ 列表长度少于512,并且所有元素的长度都少于64字节时,使用使用ziplist(压缩列表)储存,相反会使用lindedList使用

ziplist节省内存的原理

​ 普通数据能够支持随机访问的原因时储存的内存时连续的,但是有一个问题,就是数组中每一个元素的大小都是必须相同的,如果大小不一样的化,那么该元素的内存就必须按照数组中最大的元素(假设是五个字节)的内存存放,那么储存少于5ge字节的元素就会存在内存浪费问题。

linkedlist

​ 列表长度少于512,并且所有元素的长度都少于64字节时,使用使用ziplist(压缩列表)储存,相反会使用lindedList使用

6.4,intset

​ 当集合的长度少于512时,并且所有的元素地时整数时,使用intset储存,否则使用hashtable

2,五种数据类型的应用场景

string的应用场景

​ 普通的key-value键值对都可以用string来保存,

​ 1,访问量统计,每次访问博客和文章的,都用intr命令加一

​ 2,做缓存。

list的应用场景

​ 作为队列,list的两端操作比较方便,所以可以用来一些需要获取最新数据的场景。比如新闻类应用的最新新闻。

hash的应用场景

​ 用来储存,修改对象属性,如果说用户(name,age,like),文章(标题,time,作者,内容,),其中用户相当于key,而(name,age,;like)相当于vlaue

set的应用场景

​ 1,好友推荐,根据set的内容交集,大于每个值就可以推荐,

​ 2,利用set的唯一性,统计网站内容所有独立ip

zset的应用场景

​ 排行榜,因为zset时有序的

在程序中Redis的数据类型分别有什么作用

  • String:缓存,限流,计数器,分布式锁,分布式Session
  • Hash:储存用户信息,用户主页访问量,组合查询
  • List:微博关注人时间轴列表,简单队列
  • Set:赞,踩,标签,好友关系
  • Zset:排行榜

你可能感兴趣的:(redis,redis)