Redis快速入门,一篇带你系统入门,学会即加薪

Posted 吃螃蟹的小孩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis快速入门,一篇带你系统入门,学会即加薪相关的知识,希望对你有一定的参考价值。

Redis

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:主要是用来描述问题的

  1. 海量Volume:数据量大
  2. 多样Variety:数据库多样
  3. 实时Velocity:信息传递的实时性

大数据时代的3高:主要是用来解决问题的

  1. 高并发
  2. 高可扩(随时可以水平拆分)
  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能干嘛?

  1. 内存存储、持久化。

    -- 内存是断电即失的,持久化很重要
    # 关键:rdb、aof
    
  2. 效率高、可以用于高速缓存

  3. 发布订阅系统

  4. 地图信息分析

  5. 计时器、计数器(浏览量!incr decr)

特性

  1. 多样的数据类型
  2. 持久化
  3. 集群
  4. 事务

学习中需要用到的东西

- 官网:https://redis.io/
- 中文网:https://www.redis.cn/

Redis是单线程的

官方表示Redis基于内存操作CPU 不是Redis性能瓶颈,Redis的***瓶颈***是根据机器内存网络带宽决定。

能使用单线程,就使用单线程。

为什么单线程还这么快?

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

  2. 误区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
对象的设计

设计对象的存储

  1. 使用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"
    
  2. 使用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快速入门,一篇带你系统入门,学会即加薪的主要内容,如果未能解决你的问题,请参考以下文章

Markdown语法入门 一篇带你了解基本语法

echarts数据可视化详解,一篇带你入门数据可视化

深度学习入门有多难?这篇带你零基础入行

canvas入门,一篇博文带你学会用代码绘画,直击实战案例!

canvas入门,一篇博文带你学会用代码绘画,直击实战案例!

一篇详文带你入门 Redis