Redis快速入门,一篇带你系统入门,学会即加薪
Posted 吃螃蟹的小孩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis快速入门,一篇带你系统入门,学会即加薪相关的知识,希望对你有一定的参考价值。
Redis
- 1.nosql(非关系型数据库)讲解
- 2.阿里巴巴架构演进
- 3.NoSql四大分类
- 4.CAP
- 5.BASE
- 6.Redis入门
- 7.Redis安装
- 8.五大基本数据类型
- 9. 三种特殊数据类型
- 10.事务
- 11.Jedis
- 12.SpringBoot整合redis
- 13.Redis配置redis.conf详解
- 14.Redis持久化
- 15.Redis实现订阅发布
- 16.Redis主从复制
- 17.Redis哨兵模式
- 18.缓存穿透及解决方案
- 19.缓存击穿及解决方案
- 20.缓存雪崩及解决方案
- 21.小结及拓展
1.nosql(非关系型数据库)讲解
为什么要用Nosql
大数据时代->SpringBoot+SpringCloud
单机mysql的美好年代!
90年代,基本网站访问量不大,仅使用单个数据库就足够。
整个网站的瓶颈:
1.数据量如果太大了,一个机器放不下。
2.数据的索引(mysql的数据超过300w就一定要建立索引!),如果索引太大一个机器内存也放不下。
3.访问量(读写混合)一个服务器承受不了。
只要开始出现以上情况之一,就必须要晋级。
Memcached+Mysql+垂直拆分(读写分离)
网站80%的情况都是在读,每次都要查询数据库的话就十分麻烦。
所以希望减轻服务器压力,可以用缓存来保证效率。
缓存主要是用于解决读的问题,张三从数据库里读过一次就存到缓存里,等李四去读的时候就从缓存里拿。
缓存发展过程:优化数据结构和索引----->文件缓存----->Memcached(缓存)
分库分表+水平拆分+Mysql集群
本质:数据库(读+写)
慢慢地,使用分库分表来实现写的压力(把每个单独的业务单独一个数据库做成微服务)。
最近的年代
技术爆炸的30年,仅仅如mysql这样的关系型数据库就不够用了,如果用于存储博客或者文件,mysql的压力很大,数据库表大了,效率就降低了,如果有一个数据库专门来处理这种数据,就能降低mysql的压力。
为什么要使用NoSQL
用户的个人信息、社交网络、地理位置、自己产生的数据和日志等
关系型数据库就解决不掉,需要使用NoSQL数据库了,Nosql可以很好地解决以上情况。
什么是NoSql
NoSql
NoSql=Not Only Sql(不仅仅是sql)
关系型数据库:表格,行,列组成(POI使用Java代码操作Excel)
泛指非关系型数据库,随着web2.0互联网的诞生,传统的关系型数据库很难对付web2.0时代。
尤其是超大规模的高并发社区。
NoSql的特点
1.方便扩展(数据之间没有关系,很好扩展!)
2.大数据量高性能(Redis 一秒写8w次,读11w次,NoSql的缓存是一种细粒度的缓存)
3.数据类型是多样型的(不需要事先设计数据库!直接Set Get随取随用)
传统的关系型数据库(RDBMS)和非关系型数据库(NoSql)的区别
传统的关系型数据库
结构化组织
SQL
数据和关系都存储在单独的表中(row和col)
数据操作,数据定义语言
严格的一致性(ACID原则)
基础的事务
NoSql
- 不仅仅是数据
- 没有固定的查询语言
- 键值对存储、列存储、文档存储、图形数据库(社交关系)
- 最终一致性
- CAP定理和BASE(异地多活)
- 高性能、高可用、高可扩
了解:大数据时代的3V+3高
了解:3V+3高
大数据时代的3V:主要是用来描述问题的
- 海量Volume:数据量大
- 多样Variety:数据库多样
- 实时Velocity:信息传递的实时性
大数据时代的3高:主要是用来解决问题的
- 高并发
- 高可扩(随时可以水平拆分)
- 高性能(保证用户体验和性能)
真正公司上的实践:NoSql+RDBMS一起使用才是最强的
2.阿里巴巴架构演进
时间 | 关键字 |
---|---|
1999第一代网络架构 | Perl、CGI、Oracle |
2000进入Java时代 | Java+Servlet |
2001-2004EJB时代 | EJB(SLSB、CMP、MDB),Pattern(ServiceLocator、Delegate、Facade、DAO、DTO) |
2005-2007Without EJB重构 | 去EJB重构:Spring+iBatis+Webx,Antx,底层架构:iSearch、MQ+ESB,数据挖掘、CMS |
2010安全镜像 | 安全,镜像,应用服务器升级,秒杀,NoSql,SSD |
第五代网站的使命
- 敏捷
业务快速增长,每天都需要上线小需求
- 开放
提升网站开放性,提供SDK,吸引第三方开发者加入网站共建
- 体验
网站并发压力快速增长,用户对体验提出更高要求
架构师使命
# 1、商品的基本信息
名称、价格、商家信息;
关系型数据库就可以解决!
- Mysql
# 2、商品的描述、评论(文字较多的时候)
- 文档型数据库,MongoDB
# 3、图片
分布式文件系统
- Hadhoop HDFS
-阿里云 OSS
# 4、商品的关键字(搜索)
- 搜索引擎 solr elasticsearch
# 5、商品的热门波段信息
- 内存数据库 redis
# 6、商品交易、外部的支付接口
-三方应用
数据层所遇到的问题以及解决方案
问题
大型互联网所遇到的问题:
- 数据类型太多
- 数据源繁多,经常重构
- 数据要改造,大面积改造
解决方案
数据解决方案:统一数据服务层UDSL
(没有什么是加一层解决不了的)
具体实现方法:
# 在应用集群和底层数据源之间,构建一层代理统一数据层
- 统一数据层的特性:
- 模型数据映射
- 实现业务模型,各属性与底层不同类型数据源的模型数据映射
-目前支持的关系型数据库:iSearch、redis、MongoDB
- 统一的查询和更新API
- 提供了基于业务模型的统一查询和更新的API,简化网站应用跨不同数据源的开发模式
- 性能优化策略
- 字段延迟加载,按需返回设置
- 基于热点缓存平台的二级缓存
- 异步并行查询数据:异步并行加载模型中来自不同数据源的字段
- 并发保护:拒绝访问频率过高的主机或者IP
- 过滤高危查询:例如会导致数据库崩溃的全表扫描
3.NoSql四大分类
KV键值对
+ 新浪: Redis
+ 美团:Redis+Tair
+ 阿里/百度: Redis+memecache
文档型数据库
使用***bson***格式,长得和json一样,只是二进制的JSON
- MongoDB(一般必须要掌握)
- MongoDB是一个基于分布式文件存储的数据库,C++
- 主要用来处理大量的文档
- MongoDB是一个***介于***关系型数据库和非关系型数据中间的交集!
- MongoDB是非关系型数据库中功能最丰富、最像关系型数据库的!
- ConthDB(国外的)
列存储数据库
- HBase
- 分布式文件系统 Hadhoop
图关系数据库
放的是关系,而非图形
比如:
- 朋友圈社交网络
- 广告推荐
Neo4j、InfoGrid
4.CAP
5.BASE
6.Redis入门
概述
Redis是什么?
Redis(Remote Dictionary Server),即远程字典服务,也被人们称之为***结构化数据库***
功能:把周期性数据持久化还能实现主从复制
- 是一个开源的
- 用C语言编写的
- 支持网络、基于内存、可持久化的日志型Key-Value数据库
- 提供多种语言的API
Redis能干嘛?
-
内存存储、持久化。
-- 内存是断电即失的,持久化很重要 # 关键:rdb、aof
-
效率高、可以用于高速缓存
-
发布订阅系统
-
地图信息分析
-
计时器、计数器(浏览量!incr decr)
-
…
特性
- 多样的数据类型
- 持久化
- 集群
- 事务
- …
学习中需要用到的东西
- 官网:https://redis.io/
- 中文网:https://www.redis.cn/
Redis是单线程的
官方表示Redis基于内存操作,CPU 不是Redis性能瓶颈,Redis的***瓶颈***是根据机器内存
和网络带宽
决定。
能使用单线程,就使用单线程。
为什么单线程还这么快?
-
误区1:高性能的服务器一定是多线程的?
-
误区2:多线程(CPU)一定比单线程效率高?
速度比较:CPU>内存>硬盘
核心:Redis是将所有的数据全部放到内存中,所以说使用单线程效率就是最高的。(对于内存系统来说没有CPU上下文切换效率就是最高的)
逻辑:多线程的CPU上下文切换是一个
耗时
的操作
7.Redis安装
压力测试工具
refis-benchmark是一个官方自带
redis-benchmark命令参数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZGCJ2QFV-1625378600109)(/Users/xingyuchen/Library/Application Support/typora-user-images/image-20210520104154784.png)]
# 测试:100个并发 100000个请求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
如何查看分析?
Redis基础知识
- redis默认有16个数据库,默认使用第0个
select切换数据库
可以使用
select
切换数据库
# 切换到第四个数据库 使用 select (index)
select 3
dbsize查看大小
可以使用
dbsize
查看数据库大小
# 查看数据库大小
dbsize
keys查看key
可以使用
keys
查看key关键词
#查看所有的key
keys *
flushdb清空当前库
可以使用
flushdb
清空当前的库
# 清空当前库
flushdb
flushall清空所有库
可以使用
flushall
清空所有库
# 清空所有库
flushall
exists判断存在
可以使用
exist
判断是否存在
# 判断某个键是否存在 exists (key)
exists name
move移除键
可以使用
move
移除当前键
# 移除当前键 move (key) (db)
move name 1
expire过期时间
可以使用
expire
设置过期时间
# 设置某键的过期时间 expire (key) (seconds)
expire name 10
ttl查看过期时间
可以使用
ttl
查看过期时间
# 查看某键的过期时间 ttl (key)
ttl name
set设置key
可以使用
set
写入key
# 设置key set (key) (value)
set name zhangsan
get获得key值
可以使用
get
读取key值
# 获得key值 get (key)
get name
type查看类型
可以使用
type
查看key的类型
# 查看key的类型 type (key)
type name
- 端口号6379只是讽刺效应
8.五大基本数据类型
Redis-Key
Redis是一个开源的,基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件MQ。支持多种数据类型的数据结构,如字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)、与范围查询 bitmap,hyperloglogs和地理空间(geospatial)索引半径查询。内置了 复制(replication),LUA脚本(Lua scripting),LRU驱动事件(LRU eviction),事务(transactions)和不同级别的磁盘持久化(persistrnce),并通过Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。
String(字符串)
90%的程序员使用Redis只会使用String类型。
redis-cli -p 6379运行redis
命令
append追加
可以使用
append
追加字符串
# 可以使用append追加字符串,如果key不存在就相当于set key append (key) (value)
append name aaaa
strlen获取长度
可以使用
strlen
获取字符串长度
# 可以使用strlen获取字符串长度 strlen (key)
strlen name
incr实现i++效果
可以使用
incr
实现i++效果
# 可以使用incr实现i++ incr (key)
incr view
# 可以用来实现浏览量++
127.0.0.1:6379> set view 0
OK
127.0.0.1:6379> get view
"0"
127.0.0.1:6379> incr view
(integer) 1
127.0.0.1:6379> get view
"1"
decr实现i–效果
可以使用
decr
实现i–效果
# 可以使用decr实现i--效果 decr (key)
decr view
# 实现数据--
127.0.0.1:6379> decr view
(integer) 1
127.0.0.1:6379> get view
"1"
incrby设置加的步长
可以使用
incrby
设置加步长
# 可以用incrby来设置步长 incrby (key) (increment)
incrby view 10
decrby设置减的步长
可以使用
decrby
设置减步长
# 可以使用decrby来设置减步长 decrby (key) (increment)
decrby view 10
getrange获得某范围字符串
可以使用
getrange
获得某范围的字符串
# 可以使用getrange来获得某范围的字符串 getrange (key) (start) (end)
getrange name 2 5
getrange获得全部字符串
可以使用
getrange
获得全部字符串
# 可以使用getrange获得全部字符串 getrange (key) 0 -1
getrange name 0 -1
setrange替换
可以使用
setrange
把从某个位置开始改value位的值
# 可以使用setrange把从第offest位置的值开始改成value setrange (key) (offset) (value)
setrange name 2 xx
# 例子
127.0.0.1:6379> get name
"abcaaasga"
127.0.0.1:6379> setrange name 2 xx
(integer) 9
127.0.0.1:6379> get name
"abxxaasga"
Setnx不存在设置
如果key不存在则使用
setnx
设置key|set if not exit|分布式锁中常用⬇️
# 使用setnx如果key不存在的话 setnx (key) (value) (key2) (value2) ...[可以一/多key]
setnx name abc
# 例子
127.0.0.1:6379> setnx name abc
(integer) 0
127.0.0.1:6379> get name
"a"
setex设置过期时间
可以使用
setex
设置key的过期时间|set with expire
# 使用setex设置过期时间 setex (key) (second) (value)
setex name 30 abc
mset一次设置多个key
可以使用
mset
设置多个key
# 使用mset一次设置多个key mset (key1) (value1) (key2) (value2) ...
mset k1 v1 k2 v2
mget一次获取多个key
可以使用
mget
获取多个key值
# 使用mget一次获取多个key值 mget (key1) (key2) ...
mget k1 k2 k3
对象的设计
设计对象的存储
-
使用
mset
设置对象属性# mset user:{id}:{filed} mset user:1:name zhangsan user:1:age 21 # 例子 127.0.0.1:6379> mset user:1:name zhangsan user:1:age 21 OK 127.0.0.1:6379> keys * 1) "user:1:age" 2) "user:1:name"
-
使用
set
设置对象# set user:{id} {obj} set user:1 {name:zhangsan,age:3} # 例子 127.0.0.1:6379> set user:1 {name:zhangsan,age:3} OK 127.0.0.1:6379> keys * 1) "user:1" 127.0.0.1:6379> get user:1 "{name:zhangsan,age:3}"
getset先获取再设置
使用
getset
先获取再设置key
# 使用getset先获取再设置 getset (key) (value)
getset db 123
# 例子
127.0.0.1:6379> getset db redis
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db redis222
"redis"
127.0.0.1:6379> get db
"redis222"
所有的数据结构是相同的,未来会使用Jedis.(方法),命令即方法
String使用场景举例
- 计数器
- 统计多单位数量:uid:952312:follow 0
- 粉丝数
- 对象存储缓存
- …
List(列表)
在Redis里面,我们可以把list完成栈、队列、阻塞队列
List规律
所有的命令都是用l开头的
lpush 设置list值/追加到头部
使用
lpush
设置list/追加list|将某值追加到列表头部
# 使用lpush设置list lpush (listkey) (element1) (element2) ...[elements]
lpush name zhangsan lisi
# 使用lpush追加list
lpush name wangwu
# 例子
127.0.0.1:6379> lpush name zhangsan lisi
(integer) 2
127.0.0.1:6379> lrange name 0 -1
1) "lisi"
2) "zhangsan"
127.0.0.1:6379> lpush name wangwu
(integer) 3
127.0.0.1:6379> lrange name 0 -1
1) "wangwu"
2) "lisi"
3) "zhangsan"
rpush设置list值/追加到尾部
使用
rpush
设置list/追加list|将某值追加到列表尾部
# 使用rpush设置list rpush (listkey) (element1) (element2) ...[elements]
rpush name zhangsan lisi
# 使用rpush追加list
rpush name wangwu
# 例子
127.0.0.1:6379> rpush name zhangsan lisi
(integer) 2
127.0.0.1:6379> lrange name 0 -1
1) "zhangsan"
2) "lisi"
127.0.0.1:6379> rpush name wangwu
(integer) 3
127.0.0.1:6379> lrange name 0 -1
1) "zhangsan"
2) "lisi"
3) "wangwu"
lrange 查看list值
使用
lrange
查看list值(倒着取)
# 使用lrange查看list范围
lrange name 1 3
# 使用lrange查看所有list
lrange name 0 -1
lpop从队列左边移除
使用
lpop
从队列左边移除元素
# 移除队列左边第一个元素 lpop (listkey)[count]
lpop name
# 例子
127.0.0.1:6379> lpush k1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> lpop k1
"5"
127.0.0.1:6379> lrange k1 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
# 移除队列左边n个元素 lpop (key) (num)
lpop name 3
# 例子
127.0.0.1:6379> lpush name a b c d e f g h
(integer) 8
127.0.0.1:6379> lpop name 2
1) "h"
2) "g"
127.0.0.1:6379> lrange name 0 -1
1) "f"
2) "e"
3) "d"
4) "c"
5) "b"
6) "a"
rpop从队列右边移除
使用
rpop
从队列右边移除元素
# 使用rpop从队列右边移除1个元素 rpop (listkey)
rpop name
# 例子
127.0.0.1:6379> lrange name 0 -1
1) "f"
2) "e"
3) "d"
4) "c"
5) "b"
6) "a"
127.0.0.1:6379> rpop name
"a"
127.0.0.1:6379> lrange name 0 -1
1) "f"
2) "e"
3) "d"
4) "c"
5) "b"
# 使用rpop从队列右边移除n个元素 rpop (listkey) (num)
rpop name 3
# 例子
127.0.0.1:6379> rpop name 3
1) "b"
2) "c"
3) "d"
127.0.0.1:6379> lrange name 0 -1
1) "f"
2) "e"
lindex获取list的某一个值
使用
lindex
获取key的某一下标的值
# 使用lindex获取key的某一下标的值 lindex (listkey) (index)
lindex name 0
llen获取list长度
使用
llen
获取list长度
# 使用llen获取list长度 llen (listkey)
llen name
lrem移除指定的值
使用
lrem
移除指定的key值|取关功能
# 使用lrem移除count个指定的值 lrem (listkey) (count) (value)
lrem name 1 a
# 例子
127.0.0.1:6379> lrem name 2 a
(integer) 2
ltrim修剪列表
使用
ltrim
修剪从n到m的元素截取出来
# 使用ltrim修建从n到m的元素截取内容 ltrim (listkey) (start) (stop)
ltrim name 2 5
# 例子
127.0.0.1:6379> lpush name a b c d e f g h i j k
(integer) 11
127.0.0.1:6379> ltrim name 1 5
OK
127.0.0.1:6379> lrange name 0 -1
1) "j"
2) "i"
3) "h"
4) "g"
5) "f"
rpoplpush删除最后一个元素追加到另一个list
使用
rpoplpush
删除最后一个元素追加到另一个list中
# 使用rpoplpush将sourse删除一个再将被删除放到另一个destionation中 rpoplpush (source) (destination)
rpoplush list mylist
# 例子
127.0.0.1:6379> lrange list 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> lrange mylist 0 -1
1) "5"
127.0.0.1:6379> rpoplpush list mylist
"4"
127.0.0.1:6379> lrange list 0 -1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> lrange mylist 0 -1
1) "4"
2) "5"
exists判断是否列表存在
使用
exists
判断列表是否存在
# 使用exists判断列表是否存在 exists (listkey)
exists list
# 例子
127.0.0.1:6379> exists list
(integer) 0
127.0.0.1:6379> lpush list a b c d
(integer) 4
127.0.0.1:6379> exists list
(integer) 1
lset修改列表指定下标的值
使用
lset
修改指定下标的值
# 使用lset修改指定下标的值 lset (listkey) (index) (element)
lset list 1 update
# 例子
127.0.0.1:6379> lrange list 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> lset list 1 update
OK
127.0.0.1:6379> lrange list 0 -1
1) "d"
2) "update"
3) "b"
4) "a"
linsert在指定关键词前后插入
使用
linsert
在指定关键词前后插入一个新值
# 使用linsert插入一个值 linsert (listkey) (before|after) (pivot关键词) (element)
linsert list before hello nihao
# 例子
127.0.0.1:6379> lrange list 0 -1
1) "world"
2) "hello"
127.0.0.1:6379> linsert list before hello nihao
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "world"
2) "nihao"
3) "hello"
小结
- 它实际上是一个链表,before Node after,left和right都可以插入值
- 如果key不存在,可以创建新链表
- 如果key存在,新增内容
- 如果移除了所有的value,代表空链表,也表示不存在!
- 在两边插入/改动值效率最高!中间元素,相对来说效率低一点!
消息排队!消息队列Lpush Rpop ,栈Lpush Lpop!
Set(集合)
Set中的值不能重复
Set规律
所有命令都是s开头
sadd添加set集合
使用
sadd
添加元素到Set集合
# 使用sadd添加元素到Set集合 sadd (setkey) (element1) (element2)..
sadd list hello world
# 例子
127.0.0.1:6379> sadd list hello world
(integer) 2
127.0.0.1:6379> smembers list
1) "world"
2) "hello"
Smenbers查看set集合
使用
smember
查看set集合
# 使用smember查看set集合 smember (setkey)
smember list
# 例子
127.0.0.1:6379> smembers list
1) "world"
2) "hello"
sismember查看value是否是集合成员
使用
sismember
查看某元素是否是集合成员
# 使用sismember查看是否是集合成员 sismember (setkey) (element)
sismember list hello
# 例子
127.0.0.1:6379> smembers list
1) "world"
2) "hello"
127.0.0.1:6379> sismember list hello
(integer) 1
scard查看集合大小
使用
scard
查看集合大小
# 使用scard查看集合大小 scard (setkey)
scard list
# 例子
127.0.0.1:6379> scard list
(integer) 2
srem删除集合某一元素
使用
srem
删除集合的某一个元素
# 使用srem移除集合的某一个元素 srem (setkey) (element)
srem list hello
# 例子
127.0.0.1:6379> srem list hello
(integer) 1
127.0.0.1:6379> smembers list
1) "world"
srandmember随机获取集合中的值
使用
srandmember
随机获取集合中的值
# 使用srandmember随机获取集合中的值 srandmember (setkey) [count]
srandmember list
# 例子
127.0.0.1:6379> smembers list
1) "nihao"
2) "world"
3) "hello"
127.0.0.1:6379> srandmember list
"world"
127.0.0.1:6379> srandmember list
"nihao"
spop随机移除元素
使用
spop
随机移除元素
# 使用spop随机移除元素 spop (setkey) [count]
spop list
# 例子
127.0.0.1:6379> spop list
"world"
127.0.0.1:6379> smembers list
1) "hello"
2) "nihao"
smove将指定元素移动
使用
smove
将指定的元素从一个set移动到另一个set(如果没有会创建一个)
# 使用smove将指定element从set1移动到set2 smove (sourceList) (destinaionList) (member)
smove list1 list2 whz
平台功能(并集)
数字集合类:
- 差集
差集:不同两个集合中不同的元素
# 使用sdiff获得多个集合中不同的值 sdiff (list1) (list2) ...
sdiff list1 list2 ...
- 并集(共同关注,共同爱好,二度好友)
并集:不同两个集合共同的元素
# 使用sunion获得多个集合的并集 sunion (list1) (list2) ...
sunion list1 list2 ...
- 交集
交集:两个不同集合中相同的元素
# 使用sinter获得多个集合中相同的值 sinter (list1) (list2) ...
sinter list1 list2 ...
Hash(散列|哈希Map)
Map集合,key-value形式,但是是Map集合对象,本质和String类型没有太大的区别
更适合于对象的存储
Hash规律
所有命令以h开头
hset插入hash字段和值
使用
hset
插入hashMap中的字段名和值
# 使用hset插入key的字段名field和值value hset (key) (field) (value)
hset hashmap name zhangsan
# 例子
127.0.0.1:6379> hset hashmap name zhangsan age 9
(integer) 2
127.0.0.1:6379> hget hashmap name
"zhangsan"
127.0.0.1:6379> hget hashmap age
"9"
hget获取hash字段的值
使用
hget
获得hashMap中某个字段的值
# 使用hget获得hashmap中某个字段的值
hget hashmap name
# 例子
127.0.0.1:6379> hget hashmap age
"9"
hmset插入多个hash字段和值
使用
hmset
插入hashMap中的字段名和值
# 使用hmset插入key的字段名field和值value hmset (key) (field) (value)
hmset hash1 name zhangsan age 1
# 例子
127.0.0.1:6379> hmset hashmap name zhangsan age 9
(integer) 2
127.0.0.1:6379> hget hashmap name
"zhangsan"
127.0.0.1:6379> hget hashmap age
"9"
hmget获取多个hash字段的值
使用
hmget
获取多个hashMap的字段值
# 使用hmget获取多个hashMap的字段值 hmget (key) (field1) (field2) ...
hmget hashmap name age
# 例子
127.0.0.1:6379> hmget hashmap name age
1) "zhangsan"
2) "9"
hgetall获取一个key里面所有的hash值
使用
hgetall
获取一个key里面所有的hash值
# 使用hgetall获取一个key里面所有的hashMap的值 hgetall (key)
hgetall hashmap
# 例子
127.0.0.1:6379> hgetall hashmap
1) "name"字段1
2) "zhangsan"字段值1
3) "age"字段2
4) "9"字段值2
hdel删除某一个hash中的一个字段
使用
hdel
删除具体某一个hashMap中的某一个具体字段
# 使用hdel删除某一个hash中的一个具体的字段 hdel (key) (field1) (field2) ...
hdel hashmap age
# 例子
127.0.0.1:6379> hde以上是关于Redis快速入门,一篇带你系统入门,学会即加薪的主要内容,如果未能解决你的问题,请参考以下文章
canvas入门,一篇博文带你学会用代码绘画,直击实战案例!