高并发核心技术Redis系列(三)--------基本知识(上)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 代码如下

一.Redis基础知识

1. 端口6379的由来

   6379 = Merz

image.jpeg

Merz全名Alessia Merz,是意大利的一位广告女郎。

image.jpeg

2. 默认数据库

  默认有16个数据库,且初始状态默认选择0号数据库(即第一个数据库)。

3.数据库切换

可以使用select 进行数据库切换。

select 8 切换到8号数据库

2345_image_file_copy_110.jpg

4.密码管理

统一密码管理,所有库密码都一致。

5.查看key数量

dbsize-查看当前数据库的key数量。

6.清空当前库

flushdb-清空当前库。

7.清空所有库

flushall-清空所有库。

8.Redis单线程

为什么Redis是单线程且效率极高:

1).绝大部分请求是纯粹的内存操作。

2).避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗CPU,不用去考虑。各种锁的问题,不存在加锁释放锁操作。

3).使用IO多路复用技术,可以处理并发的连接。

2345_image_file_copy_111.jpg

二、Redis数据类型

  1 key键

1. keys * 查看当前库中所有的key 。

2. exists key 判断某个key是否存在。

可以设置多个key,只返回存在的个数,但不返回哪一个存在/不存在。

exists k1 查看k1是否存在,如果存在返回1
exists k1 k2 k3 查看k1 k2 k3是否存在,如果k1 k2存在,k3不存在,则返回2

3. move key db 将当前数据库的 key 移动到给定的数据库 db 当中。

move k1 8 将k1从当前数据库移动到8号库

4. type key 查看当前key 所储存的值的类型。

返回当前key所储存的值的类型,如string 、list等。

5. del key 删除已存在的key,不存在的 key 会被忽略。

可以设置多个key,返回删除成功的个数。

del k1 删除k1,如果成功返回1,失败返回0
del k1 k2 k3 删除k1 k2 k3,如果k1 k2存在,k3不存在,则返回2

6. expire key time 给key设置time秒的过期时间。

  设置成功返回 1 。 当 key 不存在返回 0。

expire k1 10 给k1设置10秒后过期

7. ttl key 以秒为单位返回 key 的剩余过期时间。

当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单

位,返回 key 的剩余生存时间。

8. persist key 移除给定 key 的过期时间,使得 key 永不过期。

当过期时间移除成功时,返回 1 。 如果 key 不存在或 key 没有设置过期时间,返回 0 。

2 五大数据类型-String(字符串)

2.1 简介

String是Redis最基本的类型,一个key对应一个value。

String是二进制安全的,意味着String可以包含任何数据,比如序列化对象或者一张图片。

String最多可以放512M的数据。

2.2 常用命令

1. set key value 用于设置给定 key 的值。如果 key 已经存储其他值, set 就重写旧值,且无视类

型。

set k1 v1  向Redis中设置一个k1的键值对
set k1 100 将k1的值由v1重置为100

2. get key 用于获取指定 key 的值。如果 key 不存在,返回 nil 。

3. append key value 将给定的value追加到key原值末尾。

如果 key 已经存在并且是一个字符串, append 命令将 value 追加到 key 原来的值的末尾。

如果 key 不存在, append 就简单地将给定 key 设为 value ,就像执行 set key value 一样。

append k1 v1 在Redis中不存在k1,所以直接设置k1的值为v1
append k1 v2 向k1的值末尾添加一个v2,最终结果为v1v2

4. strlen key 获取指定 key 所储存的字符串值的长度。当 key 储存的不是字符串值时,返回一个错

误。

5. setex key time value 给指定的 key 设置值及time 秒的过期时间。如果 key 已经存在, setex命

令将会替换旧的值,并设置过期时间。

setex k1 10 v1 向Redis中设置一个k1的键值对并且10秒后过期

6. setnx key value当key不存在时,设置给定 key 的值。如果key存在,则没有任何影响。

setnx k1 v1 向Redis中设置一个k1的键值对
setnx k1 v2 Redis中存在k1,则没有影响,k1的值仍然为v1

7. incr key 将 key 中储存的数字值增一。

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incr 操作。

如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误。

incr k1 因为Redis中不存在k1,所以先初始化为0,再递增,值为1
incr k1 存在k1,递增后k1的值为2
set k2 v2
incr k2 因为k2不为数值,Redis返回一个错误

8. decr key将 key 中储存的数字值减一。

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 decr 操作。

如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误。

decr k1 因为Redis中不存在k1,所以先初始化为0,再递增,值为-1
decr k1 存在k1,递增后k1的值为-2
set k2 v2
decr k2 因为k2不为数值,Redis返回一个错误

9. incrby/decrby key step 将key存储的数字值按照step进行增减。

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incrby/decrby 命令。

如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误。

10. mset key1 value1 key2 value2 ……同时设置一个或多个 key-value 。

mset k1 v1 k2 v2 k3 v3 同时向Redis中设置了k1 k2 k3

11. mget key1 key2 ……返回所有(一个或多个)给定 key 的值。

如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。

mget k1 k2 同时获取k1 k2

12. msetnx key1 value1 key2 value2 ……用于所有给定 key 都不存在时,同时设置一个或多个

key-value 。msetnx具有原子性特性,有一个失败,则都失败。

msetnx k1 v1 k2 v2 向Redis中设置k1 k2两个键值对
msetnx k1 v2 k3 v2 Redis中存在k1,k1设置失败,由于原子性特性,k3也设置失败

13. getrange key start end用于获取存储在指定 key 中字符串的子字符串。字符串的截取范围由

start 和 end 两个偏移量决定(包括 start 和 end 在内)。

set java helloworld 设置一个key为java,value为helloworld的值
getrange java 0 3 获取索引0-3的值,结果为hell

14. setrange key offset value用指定的字符串重写给定 key 所储存的字符串值,重写的位置从偏移量 offset 开始。

set java helloworld 设置一个key为java,value为helloworld的值
setrange java 5 baizhan 从偏移位置5(w)开始,用baizhan重写key

2.3 String底层数据结构

String底层数据结构是简单动态字符串(simple dynamic string,SDS)。

类似于JAVA中的ArrayList,采用预分配方式来减少内存的频繁分配。

image.jpeg 如图,内存实际大小一般都要高于字符串实际大小。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时每次只会多扩1M的空间。字符串最大长度为512M。

3 五大数据类型-List(列表)

3.1 简介

List是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

底层是一个双向链表,对两段操作性能极高,通过索引操作中间的节点性能较差。

image.jpeg

一个List最多可以包含 个元素 ( 每个列表超过40亿个元素)。

3.2 常用命令

1. lpush/ rpush key1 value1 value2 value3……从左边(头部)/右边(尾部)插入一个或多个

值。

lpush k1 v1 v2 v3 从左边放入v1 v2 v3

2345_image_file_copy_114.jpg

 rpush k1 v4 v5 v6 从右边放入v4 v5 v6

2345_image_file_copy_115.jpg

2. lrange key start end返回key列表中的start和end之间的元素(包含start和end)。 其中 0 表示

列表的第一个元素,-1表示最后一个元素。

lrange k1 0 2 取出列表里前3个值,结果为v3 v2 v1
lrange k1 0 -1 取出列表里全部值,结果为v3 v2 v1 v4 v5 v6

3. lpop/rpop key移除并返回第一个值/最后一个值。

值在键在,值光键亡。

lpop k1 从列表中删除v3,并返回,当前列表全部值v2 v1 v4 v5 v6
rpop k1 从列表中删除v6,并返回,当前列表全部值v2 v1 v4 v5

4. lindex key index 获取列表index位置的值(从左开始)。

5. llen key获取列表长度。

6. lrem key count value从左边开始删除与value相同的count个元素。

lrem k1 2 v1 从左边开始删除k1列表中2个v1元素

7. linsert key before/after value newvalue 在列表中value值的前边/后边插入一个newvalue值

(从左开始)。

linsert k1 before v1 v5 在v1前面插入一个v5

8. lset key index value将索引为index的值设置为value

4 五大数据类型-Set(集合)

4.1 简介

与List类似是一个列表功能,但Set是自动排重的,当需要存储一个列表数据,又不希望出现重复数据时,Set是一个很好的选择。

Set是String类型的无序集合,它底层其实是一个value为null的hash表,所以添加、删除、查找的时间复杂度都是O(1)。

一般来说,一个算法如果是O(1),随着数据增加,查找数据的时间不变。

集合中最大的成员数为 ( 每个集合超过40亿个元素)。

4.2 常用命令

1. sadd key value1 value2……将一个或多个元素添加到集合key中,已经存在的元素将被忽略。

sadd k1 v1 v2 v2 v3 v4 v5 v6向集合中添加值,最终只有v1 v2 v3 v4 v5 v6

2. smembers key取出该集合的所有元素。

smembers k1

3. sismember key value判断集合key中是否含有value元素,如有返回1,否则返回0。

sismember k1 v1

4. scard key返回该集合的元素个数。

scard k1

5. srem key value1 value2……删除集合中的一个或多个成员元素,不存在的成员元素会被忽略。

srem k1 v1 v2 删除v1 v2

6. spop key随机删除集合中一个元素并返回该元素。

spop k1 随机删除一个元素,并返回

7. srandmember key count随机取出集合中count个元素,但不会删除。

srandmember k1 2 随机取出集合中的2个元素

8. smove sourcekey destinationkey value将value元素从sourcekey集合移动到destinationkey

集合中。如果 sourcekey集合不存在或不包含指定的 value元素,则 smove 命令不执行任何操作,仅返回 0。

smove k1 k2 v5 将元素v5从集合k1中移动到集合k2

9. sinter key1 key2返回两个集合的交集元素。

10. sunion key1 key2返回两个集合的并集元素。

11. sdiff key1 key2返回两个集合的差集元素(key1中的,不包含key2)

2345_image_file_copy_116.jpg

sinter k1 k2 返回v3
sunion k1 k2 返回v1 v2 v3 v4 v5
sdiff k1 k2 返回v1 v2
sdiff k2 k1 返回v4 v5

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
20天前
|
消息中间件 缓存 NoSQL
Redis 高并发竞争 key ,如何解决这个难点?
本文主要探讨 Redis 在高并发场景下的并发竞争 Key 问题,以及较为常用的两种解决方案(分布式锁+时间戳、利用消息队列)。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Redis 高并发竞争 key ,如何解决这个难点?
|
22天前
|
缓存 NoSQL 中间件
redis高并发缓存中间件总结!
本文档详细介绍了高并发缓存中间件Redis的原理、高级操作及其在电商架构中的应用。通过阿里云的角度,分析了Redis与架构的关系,并展示了无Redis和使用Redis缓存的架构图。文档还涵盖了Redis的基本特性、应用场景、安装部署步骤、配置文件详解、启动和关闭方法、systemctl管理脚本的生成以及日志警告处理等内容。适合初学者和有一定经验的技术人员参考学习。
121 7
|
1月前
|
存储 缓存 NoSQL
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
64 4
|
1月前
|
缓存 NoSQL Ubuntu
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
56 3
|
6月前
|
消息中间件 Java Linux
2024年最全BATJ真题突击:Java基础+JVM+分布式高并发+网络编程+Linux(1),2024年最新意外的惊喜
2024年最全BATJ真题突击:Java基础+JVM+分布式高并发+网络编程+Linux(1),2024年最新意外的惊喜
|
5月前
|
缓存 NoSQL Java
Java高并发实战:利用线程池和Redis实现高效数据入库
Java高并发实战:利用线程池和Redis实现高效数据入库
500 0
|
3月前
|
监控 算法 Java
企业应用面临高并发等挑战,优化Java后台系统性能至关重要
随着互联网技术的发展,企业应用面临高并发等挑战,优化Java后台系统性能至关重要。本文提供三大技巧:1)优化JVM,如选用合适版本(如OpenJDK 11)、调整参数(如使用G1垃圾收集器)及监控性能;2)优化代码与算法,减少对象创建、合理使用集合及采用高效算法(如快速排序);3)数据库优化,包括索引、查询及分页策略改进,全面提升系统效能。
50 0
|
5月前
|
存储 NoSQL Java
探索Java分布式锁:在高并发环境下的同步访问实现与优化
【6月更文挑战第30天】Java分布式锁在高并发下确保数据一致性,通过Redis的SETNX、ZooKeeper的临时节点、数据库操作等方式实现。优化策略包括锁超时重试、续期、公平性及性能提升,关键在于平衡同步与效率,适应大规模分布式系统的需求。
174 1
|
4月前
|
算法 Java 调度
高并发架构设计三大利器:缓存、限流和降级问题之使用Java代码实现令牌桶算法问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之使用Java代码实现令牌桶算法问题如何解决
|
4月前
|
监控 网络协议 Java
Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?
Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?
75 0
下一篇
无影云桌面