Redis基本介绍 五大数据类型

news2024/11/27 16:32:59

Redis基本介绍

redis-benchmark性能测试工具

测试如:

redis-benchmark -h localhost -p 6379 -c 100 -n 10000000

redis默认有16个数据库

切换数据库和查看数据库大小 :

设置值和取值:

>set name chunling 

>get name

>keys *   #查看当前数据库所有的key

清空数据库:

flushdb         #清空当前数据库的内容

FLUSHALL   #清空全部数据库的内容

Redis是单线程的:

Redis是基于内存操作的,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,单线程实现就很快了,所以就用单线程。

Redis是C语言写的,官方提供的数据为10w+的QPS,完全不比同样实验key-value的Memecache差!

Redis单线程的为什么还那么快?

误区1:高性能的服务器一定是多线程的?

误区2:多线程(CPU上下文会切换!)一定比单线程效率高

redis是将所有数据都存放在内存中,所以说使用单线程去操作效率就算最高的,多线程(CPU上下文会切换,耗时耗资源),对于内存系统来说,如果没有上下文切换效率就算最高的!多次读写都是在一个CPU上的,在内存情况这个就算最佳方案

设置过期时间

>expire name 10   #变量name10秒后过期

>ttl name    #查看还要几秒过期

>exists name #判断当前的key是否存在

>move name 1   #移除当前的key

>type name   #查看当前key的type

=========================================================================

五大数据类型

String类型

set,get,keys*, append,exists

127.0.0.1:6379> set key1 v1
OK
127.0.0.1:6379> get key1
"v1"
127.0.0.1:6379> keys *
1) "key1"
127.0.0.1:6379> exists key1
(integer) 1
127.0.0.1:6379> append key1 "hello"   #在key1末尾增加字符串"hello"
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> strlen key1    #返回的是key1的长度
(integer) 7

应用,一些文章尾部的浏览量,incr,decr,incrby(设置步长,指定增量),decrby

127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> incr views
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> incr views
(integer) 3
127.0.0.1:6379> decr views
(integer) 2
127.0.0.1:6379> 
127.0.0.1:6379> decr views
(integer) 1
127.0.0.1:6379> incrby views 10
(integer) 11
127.0.0.1:6379> incrby views 10
(integer) 21
127.0.0.1:6379> decrby views 3
(integer) 18
127.0.0.1:6379> decrby views 3
(integer) 15

截取字符串和替换字符串

127.0.0.1:6379> set key1 "hello,my friend!"
OK
127.0.0.1:6379> get key1
"hello,my friend!"
127.0.0.1:6379> getrange key1 0 3
"hell"
127.0.0.1:6379> getrange key1 0 -1
"hello,my friend!"
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> setrange key2 1 xxcd
(integer) 7
127.0.0.1:6379> get key2
"axxcdfg"

setex设置过期时间

setnx如果不存在就创建会返回1,否则会返回0(分布式锁常用)

127.0.0.1:6379> setex key3 30 "hellllo"
OK
127.0.0.1:6379> ttl key3
(integer) 22
127.0.0.1:6379> get key3
"hellllo"
127.0.0.1:6379> setnx mykey "redis"    #1说明创建成功
(integer) 1
127.0.0.1:6379> get mykey
"redis"
127.0.0.1:6379> setnx mykey "eeeee"   #0说明创建失败,因为重复命名了
(integer) 0
127.0.0.1:6379> get mykey
"redis"
127.0.0.1:6379> get key3
(nil)
127.0.0.1:6379> ttl key3      #-2说明已经过期了
(integer) -2

mset,mget是原子性的操作,要么一起成功要么一起失败

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k3"
3) "k1"
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v1 k4 v4
(integer) 0

创建对象

方式一set:设置一个user:1 对象 值为json字符

方式二mset:user:{id}:{field} value  user:{id}:{field} value

127.0.0.1:6379> clear
127.0.0.1:6379> set user:1{name:zhangsan,age:3}
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> set user:1 {name:zhangsan,age:3}
OK
127.0.0.1:6379> get user
(nil)
127.0.0.1:6379> get user:1
"{name:zhangsan,age:3}"
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 2
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "2"
127.0.0.1:6379> 

getset 先get 没有找到再set

127.0.0.1:6379> getset db redis
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb
"redis"
127.0.0.1:6379> get db
"mongodb"

数据结构是相通的!

String类似使用场景:value除了是字符串还可以是我们的数字!

如:计数器,统计多单位的数量(如粉丝数自增,uid:xxx follower 0 incr)

List列表

把list看成双向队列,lpush和 rpush,lpop和rpop

127.0.0.1:6379> lpush list 1  #依次从头部插入值
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1  
1) "three"
2) "two"
3) "1"

127.0.0.1:6379> lrange list 0 1
1) "three"
2) "two"
127.0.0.1:6379> rpush list 666   #从尾部插入值
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "1"
4) "666"  
127.0.0.1:6379> lpop list   #移除头部元素
"three"
127.0.0.1:6379> rpop list     #移除尾部元素
"666"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "1"

获取列表长度,获取列表中指定索引的值,移除列表中指定索引的值

127.0.0.1:6379> llen list  #列表长度
(integer) 7
127.0.0.1:6379> lrange list 0 -1  #展示列表
1) "1"
2) "1"
3) "1"
4) "5"
5) "4"
6) "two"
7) "1"
127.0.0.1:6379> lindex list 4  #获取索引为4的值,索引从下标0开始
"4"
127.0.0.1:6379> lrem list 2 1  #从列表头部到尾部,依次移除两个1
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "1"
2) "5"
3) "4"
4) "two"
5) "1"

trim修剪列表,rpoplpush弹出原列表最后一个元素并将它移动到新列表中

127.0.0.1:6379> ltrim list 1 3   #只保留列表下标为1到3的值
OK
127.0.0.1:6379> lrange list 0 -1
1) "5"
2) "4"
3) "two"

127.0.0.1:6379> rpoplpush list myotherlist  #将列表list尾部元素弹出并压入到列表myotherlist头部
"two"
127.0.0.1:6379> lrange list 0 -1
1) "5"
2) "4"
127.0.0.1:6379> lrange myotherlist 0 -1
1) "two"

lset将列表成指定下标的值替换成新值,linsert将某个具体值插入到列表中某个元素的前面或后面

127.0.0.1:6379> lset list 0 77
OK
127.0.0.1:6379> lrange list 0 -1
1) "77"
2) "4"
127.0.0.1:6379> linsert list before 4 newvalue
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "77"
2) "newvalue"
3) "4"

列表总结:

可是链表可是双向队列可是栈,before,after(linsert),left,right(push)都可以插入值,通过下标获取元素lindex,利用列表可以做消息队列(Lpush Rpop),栈(Lpush Lpop)。

Set集合

set是集合元素不可重复

添加元素sadd,展示集合smembers,判断某个元素是不是集合中的元素,获取集合myset内容元素个数scard

127.0.0.1:6379> sadd myset hello   #给集合myset添加元素
(integer) 1
127.0.0.1:6379> smembers myset   #展示集合
1) "9"
2) "55"
3) "4"
4) "1"
5) "hello"
127.0.0.1:6379> sismember myset hello     #查看hello是不是集合中的元素
(integer) 1
127.0.0.1:6379> scard myset
(integer) 4



获取随机元素srandmember,移除原先集合的元素到新集合smove,删除随机元素spop

127.0.0.1:6379> srandmember myset        #从集合myset随机抽取一个元素
"hello"
127.0.0.1:6379> srandmember myset
"4"
127.0.0.1:6379> smove myset newset hello    #将集合myset的元素hello移动到集合newset
(integer) 1
127.0.0.1:6379> smembers myset
1) "1"
2) "4"
3) "9"
4) "55"
127.0.0.1:6379> smembers newset
1) "hello"


127.0.0.1:6379> smembers myset
1) "44"
2) "4422"
3) "4"
4) "2"
127.0.0.1:6379> spop myset 1    #随机删除1个元素
1) "44"
127.0.0.1:6379> spop myset 2    #随机删除2个元素
1) "2"
2) "4422"
127.0.0.1:6379> smembers myset
1) "4"

交集sinter,并集sunion,差集sdiff(应用:共同好友)

127.0.0.1:6379> sadd set2 a e f 
(integer) 3
127.0.0.1:6379> sadd set1 a b c
(integer) 3
127.0.0.1:6379> smembers set1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> smembers set2
1) "a"
2) "f"
3) "e"
127.0.0.1:6379> sdiff set1 set2   #以set1为基础,求它和set2差集
1) "b"
2) "c"

127.0.0.1:6379> sinter set1 set2    #求set1和set2的交集
1) "a"
127.0.0.1:6379> sunion set1 set2    #求set1和set2的并集
1) "a"
2) "f"
3) "b"
4) "c"
5) "e"

Hash类型

Map集合,key-map,这个值是一个map集合,本质和String类型没有太大区别,还是一个简单的key-value

向哈希表myhash添加(单个/多个)key-value

获取一个字段值/获取多个字段值/获取全部数据

删除myhash指定的key字段

127.0.0.1:6379> hset myhash f1 hello  #设置单个key-value
(integer) 1
127.0.0.1:6379> hget myhash f1
"hello"
127.0.0.1:6379> hset myhash f1 hello f2 my f3 friend  #设置多个key-value
(integer) 2
127.0.0.1:6379> hgetall myhash     #获取myhash所有元素
1) "f1"
2) "hello"
3) "f2"
4) "my"
5) "f3"
6) "friend"
127.0.0.1:6379> hmget myhash f1 f2   #获取myhash多个元素
1) "hello"
2) "my"
127.0.0.1:6379> hdel myhash f1       #获取myhash指定字段。其对应的value也会消失
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "f2"
2) "my"
3) "f3"
4) "friend"

获取hash表的大小hlen,

判断某个属性是否存在hexists

获得所有hkeys/hvals

某属性的数值自增/减hincrby

添加属性值如果不存在返回1,存在返回0 hset

127.0.0.1:6379> hlen myhash
(integer) 2
127.0.0.1:6379> hexists myhash f2
(integer) 1
127.0.0.1:6379> hkeys myhash
1) "f2"
2) "f3"
127.0.0.1:6379> hvals myhash
1) "my"
2) "friend"
127.0.0.1:6379> hset myhash f3 5
(integer) 0
127.0.0.1:6379> hset myhash f1 5
(integer) 1
127.0.0.1:6379> hincrby myhash f1 2
(integer) 7
127.0.0.1:6379> hincrby myhash f1 2
(integer) 9
127.0.0.1:6379> hincrby myhash f1 -3
(integer) 6
127.0.0.1:6379> hsetnx myhash f3 hello
(integer) 0
127.0.0.1:6379> hsetnx myhash f4 hello
(integer) 1

hash变更的数据user name age,尤其是用户信息之类,因此hash更适合于对象的存储,而String更是哈哈字符串的存储

Zset类型

将set中元素按升序查出,按降序查出,按范围筛选查出

127.0.0.1:6379> zadd salary 2500 xiao
(integer) 1
127.0.0.1:6379> zadd salary 500 o
(integer) 1
127.0.0.1:6379> zadd salary 10000 sss
(integer) 1
127.0.0.1:6379> zrangebyscore salary 0 -1
(empty array)
127.0.0.1:6379> zrangebyscore salary -1 0
(empty array)
127.0.0.1:6379> zrangebyscore salary 0 +inf  #升序
1) "o"
2) "xiao"
3) "sss"
127.0.0.1:6379> zrevrange salary 0 -1   #降序
1) "sss"
2) "xiao"
3) "o"
127.0.0.1:6379> zrevrange salary 0 -100
(empty array)

127.0.0.1:6379> zrangebyscore salary -1 600  #查找工资在范围-1~600间的
1) "o"

移除有序集合salary指定元素zrem,获取有序集合个数zcard

127.0.0.1:6379> zrem salary xiao
(integer) 1
127.0.0.1:6379> zrevrange salary 0 -1
1) "sss"
2) "o"
127.0.0.1:6379> zcard salary
(integer) 2

获取指定区间内,有序集合myset的元素个数

127.0.0.1:6379> zadd myset 1 hello
(integer) 1
127.0.0.1:6379> zadd myset 2 my 3 friend
(integer) 2
127.0.0.1:6379> zrange myset 0 -1
1) "hello"
2) "my"
3) "friend"
127.0.0.1:6379> zadd myset 0 zz  #注意看,设置的分数是0,因此会插入在第一位哦
(integer) 1
127.0.0.1:6379> zrange myset 0 -1    
1) "zz"
2) "hello"
3) "my"
4) "friend"
127.0.0.1:6379> zcount myset 1 3      #指定范围的个数
(integer) 3

Zset适合做排行榜

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/573193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python+django网上美食菜品订餐系统的设计与实现vue

随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,好吃网线上订餐系统当然也不能排除在外,从美食类型、美食信息的统计和分析,在过程中会产生大量的、各种…

与创新者同行,共享数字时代创新红利-通付盾城市沙龙圆满举行!

5月25日,通付盾城市沙龙在深圳圆满举行。通付盾与多家企业分享了数字安全创新实践-“WAAP解决方案、GPT助力APP合规开发解决方案、UIAM解决方案”,与合作伙伴共话生态,共同起航,共创未来! 会上,通付盾面向各…

基于java的篮球论坛系统的设计与实现

背景 过网上调查和搜集数据,我们可以发现篮球论坛管理方面的系统在中并不是相当普及,在篮球论坛管理方面的可以有许多改进。实际上如今信息化成为一个未来的趋势或者可以说在当前现代化的城市典范中,信息化已经成为主流,开发一个篮球论坛系统一方面的可能会更合乎时宜,另一方面…

springboot+vue财务管理系统(java项目源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的财务管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风歌&a…

opencv_c++学习(二十四)

一、积分图像 积分图像是对原图像进行积分操作的算法。如上图左所示,不同颜色代表不同区域。当我们想求取一个像素点的积分值时,我们需要求取该点左上方区域的数据之和,如P0的积分值是浅蓝色区域的数据之和。 P1的积分值为蓝色和橙色区域的数…

SSM框架学习-SSM整合(整合配置、功能模块开发、接口测试)

1. 整合配置 首先创建maven模块&#xff0c;导入相应的坐标 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.10.RELEASE</version></dependency&g…

计算机是如何工作的??(多进程编程)

目录 多进程编程进程调度组织进程调度 本篇博客的重点知识是进程进程的调度 操作系统&#xff1a;像是windows&#xff0c;android&#xff0c;iOS等都是常见的操作系统 下面是关于计算机在底层工作的原理流程图 在操作系统层面&#xff1a; 对上&#xff0c;要给软件提供稳…

《低代码指南》——低代码维格云能源行业解决方案

目录 典型场景介绍: 一、能源资产管理 二、碳核查 三、配电运营 总 结: 从业界实际情况来看,流程建设本身是一个对业务现实进行抽象的过程,这个过程即使不考虑软件开发的门槛,对于很多客户而言也是个涉及较长周期的复杂工作,往往需要咨询专家或专业公司帮助其建设内…

【Python】函数式编程例子

知识目录 一、写在前面&#x1f37a;二、七段数码管显示倒计时✨三、斐波那契序列&#x1f37a;四、总结撒花&#x1f60a; 一、写在前面&#x1f37a; 大家好&#xff01;我是初心&#xff0c;今天我们回到了Python从入门到精通。 今天跟大家分享的文章是 Python中函数的使用…

sentinel原理分析及源码剖析

sentinel功能 sentinel功能可参考官网 可以从sentinel的dashboard中了解到sentinel的核心功能包括 流控规则 阈值类型&#xff1a;QPS、并发线程数流控模式&#xff1a;直接&#xff0c;关联&#xff0c;链路流控效果&#xff1a;快速失败&#xff08;滑动时间窗算法Default…

分享Python采集99个焦点图,总有一款适合您

分享Python采集99个焦点图&#xff0c;总有一款适合您 Python采集的99个焦点图下载链接&#xff1a;https://pan.baidu.com/s/1887LXr2ovCAw-Bp7PuM66g?pwdbyx4 提取码&#xff1a;byx4 原创Jquery焦点图片切换效果 自定义大小&#xff0c;使用方 jquery立体式缩略图焦点图…

Linux系统之编译安装python3

Linux系统之编译安装python3 一、python3介绍1. python3简介2. python3特点 二、检查本地环境1. 检查本地操作系统版本2. 检查内核版本3. 检查当前python版本 三、安装前准备工作四、下载python最新版本源码包1. 访问python官网2. 创建下载目录3. 下载python源码包4. 解压pytho…

Git业务实践记录

您好&#xff0c;如果喜欢我的文章&#xff0c;可以关注我的公众号「量子前端」&#xff0c;将不定期关注推送前端好文~ 场景描述 最近在开发一个新的功能&#xff0c;和往常一样先建了一个分支进行开发&#xff0c;开发到周期60%的时候&#xff0c;后端临时通知需要将大功能…

思维导图到底有多少种?

思维导图是一种非常实用的工具&#xff0c;它可以帮助我们更好地组织和表达我们的思想。在日常生活和工作中&#xff0c;我们可以使用各种不同类型的思维导图来解决不同的问题。下面&#xff0c;我将介绍一些常见的思维导图类型以及如何使用ProcessOn思维导图软件制作思维导图。…

前端学习--Vue(5)

一、动态组件 动态切换组件的显示与隐藏 1.1 <component>组件 <!-- component是vue内置的标签占位符 is中规定标签名 --><component :is"comName"></component> 动态组件在被展示的时候被创建&#xff0c;隐藏的时候被销毁 如果想要组件…

Day1:Windows消息循环机制

先区分几个概念 系统&#xff1a;特指Windwos操作系统 应用程序&#xff1a;指一个程序&#xff0c;比如QQ&#xff0c;微信等 窗口&#xff1a;每个应用程序都 可以拥有窗口&#xff0c;而且可以有多个&#xff0c;但一般会有一个主窗口。 消息&#xff1a;window系统定义…

【系统集成项目管理工程师】计算题专题二

七、进度网络计算题 1、单代号网络图 六标时图 正推取大&#xff08;红色&#xff09;&#xff1b;反推取小&#xff08;绿色&#xff09; 关键路径&#xff1a;ACDE&#xff08;关键路径下的活动总浮动时间都是 0&#xff09; 浮动时间&#xff08;总时长&#xff09;&…

《Spring Guides系列学习》guide31 - guide34 及中期简单回顾

要想全面快速学习Spring的内容&#xff0c;最好的方法肯定是先去Spring官网去查阅文档&#xff0c;在Spring官网中找到了适合新手了解的官网Guides&#xff0c;一共68篇&#xff0c;打算全部过一遍&#xff0c;能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…

Scrum敏捷迭代规划和执行

Sprint Backlog看板 迭代工作的开展是围绕Sprint Backlog展开的&#xff0c;在Leangoo中&#xff0c;我们需要为每个迭代创建一个Sprint Backlog看板。Sprint Backlog&#xff08;迭代&#xff09;看板&#xff0c;用于管理当前Sprint的需求和开发任务&#xff0c;可视化展示每…

Cesium教程(七):加载自定义影像数据

GIS开发中经常需要调用本地或供应方发布的影像数据,加载独立的场景,此时可以借助GeoServer发 布自定义影像数据。 geoserver下载地址:geoserver下载 1、geoserver安装 1.1 安装方式1(推荐) 要求已安装tomcat:下载 Web Archive 版本的GeoServer,下载完毕解压,目 录如…