0


【Redis|1】Redis基本数据类型及其常用命令

努力最大的意义在于谋求更多的选择权,储蓄更多的安全感,让内心不失控,生活不失序。

文章标记颜色说明:

  • 黄色:重要标题
  • 红色:用来标记结论
  • 绿色:用来标记一级论点
  • 蓝色:用来标记二级论点

1 redis介绍

  • 远程字典服务:Redis是「Remote Dictionary Service」的首字母缩写
  • 中间件:Redis 是互联网技术领域使用最为广泛的存储中间件

1.1 优势:

  • 超高的性能
  • 完美的文档
  • 简洁易懂的源码
  • 丰富的客户端库支持

1.2 使用情况:

redis在开源中间件领域广受好评。

国内外很多大型互联网 公司都在使用 Redis,比如 Twitter、YouPorn、暴雪娱乐、Github、StackOverflow、腾讯、 阿里、京东、华为、新浪微博等等,很多中小型公司也都有应用。

可以说,对 Redis 的了解和应用实践是中高级后端开发者的必备技能。

1.3 安装

  • 网页版redis Try Redis
  • 直接安装 yum
  • github源码编译
  • docker安装

以上多种方式可以进行安装,现在介绍使用docker的安装方式

# 拉取 redis 镜像
docker pull redis 
# 运行 redis 容器
docker run --name redis -d -p6379:6379 redis 
# 执行容器中的 redis-cli,可以直接使用命令行操作 redis
docker exec -it redis redis-cli

安装成功,可以看到:

进入容器之后,可以看到

2 基本数据类型

基本数据类型有5种,如下:

  • String
  • Hash
  • List
  • Set
  • ZSet

2.1 String

  • 是最基本的数据类型
  • key-value 一一对应
  • 最大储存值未512MB
  • 动态字符串,可修改

类型:字符串,整数,浮点数

使用:可做简单的键值对缓存

使用场景:缓存,限流,计数器,分布式锁,分布式Session

常用命令

set: set key value     #设置key-value
get: get key           #获取值
incr: incr key         #自增,value 为数字时,生效
decr: decr key         #自减,value 为数字时,生效
mget: mget key1 key2   #一次性获取多个值  

set:往redis里面输入Key-Value,比如:set name test,Value值为:test

get:输入key值,可返回value值

127.0.0.1:6379> set name test
OK
127.0.0.1:6379> get name
"test"

inc:自增1

decr:自减1


127.0.0.1:6379> set num 1
OK
127.0.0.1:6379> get num
"1"
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> get num
"2"
127.0.0.1:6379> decr num
(integer) 1
127.0.0.1:6379> get num
"1"
127.0.0.1:6379> mget name num
1) "test"
2) "1"

mget:一次获取多value值

127.0.0.1:6379> mget name num
1) "test"
2) "1"

2.2 Hash-字典

  • 无序字典
  • 数组+链表二位结构
  • 字典的值只能是字符串
  • 渐进式rehash策略

Redis 的字典相当于 Java 语言里面的 HashMap,它是无序字典。

内部实现结构上同 Java 的 HashMap 是一致的,同样的数组 + 链表二维结构。第一维 hash 的数组位置碰撞 时,就会将碰撞的元素使用链表串接起来。

**渐进式 **rehash

  1. 在 rehash 的同时,保留新旧两个 hash 结构,
  2. 查询时会同时查询两个 hash 结构,在后续的定时任务中以及 hash 的子指令中,循序渐进地将旧 hash 的内容 一点点迁移到新的 hash 结构中
  3. 当 hash 移除了最后一个元素之后,该数据结构自动被删除,内存被回收

使用场景:储存用户信息,用户主页访问量,组合查询

常用命令

  • hset:往hash里,添加key-value
  • hget:通过key值,从hash里取对应的value
  • hmget:一次性获取多个key的value

** hset 格式:**

127.0.0.1:6379> hset key field value [field value ...]

hset

127.0.0.1:6379> hset testhash name1 python1
(integer) 1
127.0.0.1:6379> hset testhash name2 pytho2
(integer) 1
127.0.0.1:6379> hset testhash name3 pytho3
(integer) 1
127.0.0.1:6379> 

hget

127.0.0.1:6379> hget testhash name3
"pytho3"
127.0.0.1:6379> 

hmget

127.0.0.1:6379> hmget testhash name1 name2 name3
1) "python1"
2) "pytho2"
3) "pytho3"
127.0.0.1:6379> 

2.3 List-列表

Redis 的列表相当于Java 语言里面的 LinkedList,是链表而不是数组。

list 的插入和删除操作非常快,时间复杂度为 O(1)

但是索引定位很慢,时间复杂度为 O(n),这点让人非常意外。

场景:

Redis 的列表结构常用来做异步队列使用。

将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另一个线程从这个列表中轮询数据进行处理。

简单队列,堆,栈相关业务场景

常用命令:

lpush:  lpush lpush key element [element ...] #从列表List的最左边插入一个元素

lpop: lpop key                                #从列表List的左边移出一个元素

rpush:    #从列表List的右边插入一个元素

rpop: rpop key [count]                         #从列表List的右边移出一个元素

llen: llen key                                 #打印当前列表List的元素个数

lpush:

127.0.0.1:6379> lpush list1 java
(integer) 1
127.0.0.1:6379> lpush list1 python
(integer) 2
127.0.0.1:6379> lpush list1 ja
(integer) 3
127.0.0.1:6379> lpush list1 js
(integer) 4
127.0.0.1:6379> 

lpop,llen,rpop

127.0.0.1:6379> lpop list1 1
1) "js"
127.0.0.1:6379> llen list1
(integer) 3
127.0.0.1:6379> rpop list1
"java"
127.0.0.1:6379> llen list1
(integer) 2
127.0.0.1:6379> 

2.4 Set

  • 键值对:是无序/唯一

Redis 的集合相当于 Java 语言里面的 HashSet,它内部的键值对是无序的唯一的。

它的内部实现相当于一个特殊的字典,字典中所有的 value 都是一个值 NULL。

当集合中最后一个元素移除之后,数据结构自动删除,内存被回收。

set 结构适合数据不允许重复的业务场景,

例如:可以用来存储活动中奖的用户 ID,因为有去重功能,可以保证同一个用户不会中奖两次。

使用场景:赞,踩,标签,好友关系,好友推荐,唯一属性的相关业务

常用命令:

sadd: sadd key member [member ...]      #往set中添加数据

srem:                         #从set中删除数据

scard:                        #查看set中存在的元素个数

sismember:                    #查看set中是否存在某个数据

使用方法:

2.5 zset

zset 可以说是 Redis 提供的特色的数据结构,它也是在面试中面试官最爱问的数据结

构。

它类似于 Java 的 SortedSet 和 HashMap 的结合体,

  • 它是一个 set,保证了内部 value 的唯一性,
  • 它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。

它的内部实现用的是一种叫着「跳跃列表」的数据结构。

(类似有序的set)

使用场景:排行榜

常用命令:

zadd:  zadd key [NX|XX] [GT|LT] [CH] [INCR] score member        #添加数据
zrem:  zrem key member [member ...]                             #删除元素
zcard: zcard key                                                #查询数据
zrange:  zrange key start stop [BYSCORE|BYLEX] [REV] [LIMIT offset count] [WITHSCORES]       #数据排序,根据分数从大到小
zrevrange:   zrevrange key start stop [WITHSCORES]              #数据排序,分数从大到小

简单实用示例:

127.0.0.1:6379> zadd book 1 java
(integer) 1
127.0.0.1:6379> zadd book 3 python
(integer) 1
127.0.0.1:6379> zadd book 2 js
(integer) 1
127.0.0.1:6379> zcard book
(integer) 3
127.0.0.1:6379> zrange book 0 3 withscores
1) "java"
2) "1"
3) "js"
4) "2"
5) "python"
6) "3"
127.0.0.1:6379> zrevrange book 0 3 withscores
1) "python"
2) "3"
3) "js"
4) "2"
5) "java"
6) "1"
127.0.0.1:6379> 

标签: redis 数据库 缓存

本文转载自: https://blog.csdn.net/weixin_36755535/article/details/128903117
版权归原作者 颜淡慕潇 所有, 如有侵权,请联系我们删除。

“【Redis|1】Redis基本数据类型及其常用命令”的评论:

还没有评论