Redis的8种数据类型

发布时间 2024-01-04 10:40:06作者: Lafite-1820

目录

一、概述

1、redis是什么
2、redis能干嘛
3、redis常识

3.1、基本命令
3.2、为什么redis是单线程

二、五大数据类型

1、String
2、List列表
3、Set
4、Hash
5、Zset有序集合

三、三种特殊数据类型

1、geospatial地理位置
2、hyperloglog
3、bitmaps

一、概述

1、redis是什么

    Redis:REmote DIctionary Server(远程字典服务器)
    是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(Key/Value)分布式内存数据库,基于内存运行,并支持持久化的NoSQL数据库,是当前最热门的NoSQL数据库之一,也被人们称为数据结构服务器。

    Redis与其他key-value缓存产品有以下三个特点:

    1、Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
    2、Redis不仅仅支持简单的 key-value 类型的数据,同时还提供list、set、zset、hash等数据结构的存储。
    3、Redis支持数据的备份,即master-slave模式的数据备份。

2、redis能干嘛

内存存储和持久化:redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务。众多语言都支
持Redis,因为Redis交换数据快,所以在服务器中常用来存储一些需要频繁调取的数据,这样可以大
大节省系统直接读取磁盘来获得数据的I/O开销,更重要的是可以极大提升速度。

3、redis常识

3.1、基本命令

linux下redis的默认安装路径为:/usr/local/bin

默认16个数据库,类似数组下标从0开始,初始默认使用1号库(索引为0)

	切换数据库命令:select x
	查看DB大小:DBSIZE
	数据库存储值:set  key vale
	获取值:get key
	exists key:判断是否存在该key值,存在该key值则返回1,不存在返回0
	keys *:查看数据库所有的key
	flushdb:清空当前数据库
	flushall:清空所有数据库
	expire key xxx:设置key值xxx秒过期
	ttl key:查看该key值剩余多少秒过期
	persist key:取消过期
	type key:查看当前key的类型
	dbsize:查看当前库的key的数量

3.2、为什么redis是单线程

因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就 顺理成章地采用单线程的方案了。

二、五大数据类型

1、String

	 set key value:设置值
	 get key:获取值
	 del  key:删除key
	strlen key:获取该key值对应的value值的长度
	append  key   "xxx":在该key对应的value值追加上xxx
	incr key:该key对应的value自增1
	decr key:该key对应的value自减1'
	incrby key  xx:该key对应的value增加xx
	decrby key  xx:减少xx
	getrange key x1 x2: 获取x1-x2范围内的值,类似between...and的关系,从零到负一表示全部
	String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。常规key-value缓存应用: 常规计数:微博数,粉丝数等

2、List列表

	所有的list命令都是用l开头的
	lpush  集合名   xx:将xx插入到集合头部
	rpush:将xx插入到集合尾部
	lrange 集合名  x y:获取集合里x-y的值    (0  -1为获取集合中所有的值)
	lpop  集合名:移除该集合的左值
	rpop:移除该集合的右值
	lindex  集合名   x:获取该集合中下标为x的值
	llen  集合名:获取集合的长度
	lset 集合名 index xx:该集合下标为index的值更新为xx(不能添加)
	linsert  集合名  before  yy  xx:在集合中的yy值前面插入一个xx值
	linsert   集合名  after     yy xx:在集合中的yy值后插入一个xx值

总结:

  • 1、它是一个字符串链表,left,right 都可以插入添加
  • 2、如果键不存在,创建新的链表 如果键已存在,新增内容
  • 3、如果值全移除,对应的键也就消失了
  • 4、链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了。

list就是链表使用Lists结构,我们可以轻松地实现最新消息排队等功能。List的另一个应用就是消息队列,可以利用List的PUSH操作,将任务存在List中,然后工 作线程再用POP操作将任务取出进行执行。Redis还提供了操作List中某一段的api,你可以直接查询,删 除List中某一段的元素。 Redis的list是每个子元素都是String类型的双向链表,可以通过push和pop操作从列表的头部或者尾部 添加或者删除元素,这样List即可以作为栈,也可以作为队.

3、Set

	set中的值是不能重复的
	sadd  集合名  值:向set集合中添加值
	smembers  集合名:查看该set集合中所有的值
	srem 集合名 值:移除set集合中的某个值
	srandmember 集合名:随机取出集合中的一个值
	spop 集合名:随机删除一些set集合中的元素
	smove set1 set2 "xx":把set1中的xx移动到set2
	sdiff  set1 set2:差集
	sinter set1 set2:交集
	sunion set1 set2:并集 

4、Hash

	hset   集合名  key1   value1:给map集合中添加一个或者多个key-value键值对
	hget 集合名  key:获取对应的key的value值
	hgetall 集合名:获取集合中所有的键值对
	hexists  集合名   key:判断该集合中的指定key是否存在
	hkeys 集合名:获取集合中所有的key

5、Zset有序集合

	zadd 集合名   scroe值    xx:想集合中增加xx值,排序的时候通过score的值进行排序
	zrange 集合名 0 -1:查询集合中所有的值,默认按照score值的升序排列
	zrangebyscore 集合名  -inf +inf:按score值升序排列,可以用具体值替换+-inf,例如[-inf,2000]
	zrevrangebyscore  集合名   +inf -inf:按照score的值降序排列
	zrem  集合名  值:移除该集合中的指定元素
	zcard  集合名:获取有序集合中的元素的个数

三、三种特殊数据类型

1、geospatial地理位置

	geoadd     MM    经度1 纬度1  城市1   经度2 纬度2 城市2:在MM中存储两个城市的位置信息
	geopos    MM     城市1:取出MM中指定城市的的经度和纬度
	geodist    MM    城市1  城市2   m/km:计算两个城市之间的距离,单位为m/km
	georadius     MM    经度 纬度 500km:MM下所有距离该位置半径为500km的范围内的城市
	georadiusbymember MM  城市1 1000km:找出MM下距离城市1000km范围内的城市

2、hyperloglog

基数: 一个集合中不重复的元素的个数 HyperLogLog则是一种算法,它提供了不精确的去重计数方案。
优点: 在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

命令:

  • [PFADD key element [element ...] 添加指定元素到 HyperLogLog 中。
  • [PFCOUNT key [key ...] 返回给定 HyperLogLog 的基数估算值。
  • [PFMERGE destkey sourcekey [sourcekey ...] 将多个 HyperLogLog 合并为一个 HyperLogLog,并 集计算

测试:
image

3、bitmaps

setbit key offset value : 设置 key 的第 offset 位为value (1或0)

# 使用 bitmap 来记录上述事例中一周的打卡记录如下所示:

# 周一:1,周二:0,周三:0,周四:1,周五:1,周六:0,周天:0 (1 为打卡,0 为不打卡)

127.0.0.1:6379> setbit sign 0 1

127.0.0.1:6379> setbit sign 1 0

127.0.0.1:6379> setbit sign 2 0

127.0.0.1:6379> setbit sign 3 1 

127.0.0.1:6379> setbit sign 4 1 

127.0.0.1:6379> setbit sign 5 0 

127.0.0.1:6379> setbit sign 6 0 

getbit key offset 获取offset设置的值,未设置过默认返回0

127.0.0.1:6379> getbit sign 3 # 查看周四是否打卡
1
127.0.0.1:6379> getbit sign 6 # 查看周七是否打卡
0

bitcount key [start, end] 统计 key 上位为1的个数

# 统计这周打卡的记录,可以看到只有3天是打卡的状态:
127.0.0.1:6379> bitcount sign
3

原文链接:https://blog.csdn.net/m0_46979453/article/details/121320972