文章目录
- 1,数据类型
- 1,String
- 2,List
- 3,Set
- 4,Hash
- 5,ZSet
- 6,五种数据类型的原理
- 2,五种数据类型的应用场景
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"
expire**:设置键值对存储10秒
expire mykey 10
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"
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"
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"
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"
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"
zrem:删除元素
192.168.119.139:0>zrem database redis
"1"
**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"
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,五种数据类型的原理
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:排行榜
关注老爷点个赞
加入QQ技术交流群(432972658)