百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis总结(redis的lpush)

mhr18 2024-11-11 11:56 27 浏览 0 评论

资源列表:

http://doc.redisfans.com/

https://redis.io/commands

Redis是什么

  Redis是一个开源(BSD许可)的内存中的数据结构存储,用作数据库、缓存和消息中间件。它支持多种数据结构,如字符串、哈希表、列表、无序集合、有序集合的范围查询,位图、基数统计和地理空间索引的与查询。Redis内置复制、Lua脚本、LRU回收、事务和不同级别的磁盘持久化,并通过哨兵和自动分区提供高可用性集群。

单线程结构

  • 纯内存数据库,瓶颈不在内存,在于网络IO
  • 单线程,避免频繁切换上下文
  • 异步阻塞I/O(多路复用)

持久化

RDB(Redis DataBase)持久化

  • 快照
  • 优点:适合备份、还原、恢复数据快、最大化 Redis 的性能
  • 缺点:两次快照间的数据会丢失、数据集比较庞大时, fork() 可能会非常耗时

AOF(Append Only File)持久化

  • 日志
  • 优点:数据完整性高、可读性高、可重写(重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合)
  • 缺点:体积大、慢于RDB、有bug

事务

multi开启事务,exec执行事务

  可以看到,redis事务实现原理是将要执行的命令,存储到一个队列中,依次执行,报错时停止并取消事务,不报错则提交事务。

例外:不会回滚的情况:

当一个事务中某一条(多条)命令加入队列不报错,执行时才会报错,则redis会忽略错误继续执行。

  使用watch监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。当exec被调用时, 不管事务是否成功执行, 对所有键的监视都会被取消。或者调用unwatch手动取消监控。

管道

  • pipeline通过减少客户端与redis的通信次数来实现降低往返延时时间,而且Pipeline 实现的原理是队列,而队列的原理是时先进先出,这样就保证数据的顺序性。
  • 适用场景:批量操作、可靠性要求不高、

Lua脚本

  Lua是一个高效的轻量级脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能,从定义上来说, Redis 中的脚本本身就是一种事务, 所以任何在事务里可以完成的事, 在脚本里面也能完成。 并且一般来说, 使用脚本要来得更简单,并且速度更快。

  • 通过lua脚本可以原子执行多条redis命令
  • 执行lua脚本期间,会阻塞所有命令操作

使用脚本的好处

  • 减少网络开销,在Lua脚本中可以把多个命令放在同一个脚本中运行
  • 原子操作,redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。换句话说,编写脚本的过程中无需担心会出现竞态条件
  • 复用性,客户端发送的脚本会永远存储在redis中,这意味着其他客户端可以复用这一脚本来完成同样的逻辑

多数据库支持

默认支持16个数据库;可以理解为一个命名空间

跟关系型数据库不一样的点

  1. redis不支持自定义数据库名词
  2. 每个数据库不能单独设置授权
  3. 每个数据库之间并不是完全隔离的。 可以通过flushall命令清空redis实例面的所有数据库中的数据

通过 select dbid 去选择不同的数据库命名空间 。 dbid的取值范围默认是0 -15

分布式集群

  Redis Cluster中,Sharding采用slot(槽)的概念,一共分成16384个槽,这有点儿类似前面讲的pre sharding思路。对于每个进入Redis的键值对,根据key进行散列,分配到这16384个slot中的某一个中。使用的hash算法也比较简单,就是CRC16后16384取模。Redis集群中的每个node(节点)负责分摊这16384个slot中的一部分,也就是说,每个slot都对应一个node负责处理。当动态添加或减少node节点时,需要将16384个槽做个再分配,槽中的键值也要迁移。当然,这一过程,在目前实现中,还处于半自动状态,需要人工介入。Redis集群,要保证16384个槽对应的node都正常工作,如果某个node发生故障,那它负责的slots也就失效,整个集群将不能工作。为了增加集群的可访问性,官方推荐的方案是将node配置成主从结构,即一个master主节点,挂n个slave从节点。这时,如果主节点失效,Redis Cluster会根据选举算法从slave节点中选择一个上升为主节点,整个集群继续对外提供服务。这非常类似服务器节点通过Sentinel监控架构成主从结构,只是Redis Cluster本身提供了故障转移容错的能力。

  • redis sharding
  • codis
  • twemproxy

支持的数据类型、常用命令、常用场景

String

默认存储最大容量为512M

常用命令:http://doc.redisfans.com/string/set.html、http://doc.redisfans.com/string/get.html、http://doc.redisfans.com/string/incr.html、http://doc.redisfans.com/string/decr.html、http://doc.redisfans.com/string/append.html、http://doc.redisfans.com/string/strlen.html、http://doc.redisfans.com/string/mget.html、http://doc.redisfans.com/string/setnx.html

  • set+get:缓存、单点登录
  • bitmap:用户上线次数统计
  • incr:计数器、限速器

List

有序,可重复

常用命令:http://doc.redisfans.com/list/push.html、http://doc.redisfans.com/list/rpush.html、http://doc.redisfans.com/list/lpop.html、http://doc.redisfans.com/list/rpop.html、http://doc.redisfans.com/list/llen.html、http://doc.redisfans.com/list/lrange.html、http://doc.redisfans.com/list/lrem.html、http://doc.redisfans.com/list/lset.html

  • lpush+lpop:Stack(栈)
  • lpush+rpop:Queue(队列)
  • lpush+ltrim:Capped Collection(有限集合)
  • lpush+brpop:Message Queue(消息队列)
  • blpop:事件提醒(替代轮询)

Hash

不支持数据类型的嵌套

适合存储对象

常用命令:http://doc.redisfans.com/hash/hset.html、http://doc.redisfans.com/hash/hget.html、[hmset](http://doc.redisfans.com/hash/hmset

,.html)、http://doc.redisfans.com/hash/hmget.html、http://doc.redisfans.com/hash/hgetall.html、http://doc.redisfans.com/hash/hexists.html、http://doc.redisfans.com/hash/hincryby.html、http://doc.redisfans.com/hash/hsetnx.html、http://doc.redisfans.com/hash/hdel.html

Set

无序、不重复

常用命令:http://doc.redisfans.com/set/sadd.html、http://doc.redisfans.com/set/srem.html、http://doc.redisfans.com/set/smembers.html、http://doc.redisfans.com/set/sdiff.html、http://doc.redisfans.com/set/sunion.html、http://doc.redisfans.com/set/sinter.html

  • sadd:标签
  • sinter:交集
  • sunion:并集

SortedSet

有序、不重复

常用命令:http://doc.redisfans.com/sorted_set/zadd.html、http://doc.redisfans.com/sorted_set/zrange.html

  • zcount:统计信息
  • zrevrange:排行榜

key

常用命令:http://doc.redisfans.com/key/expire.html、http://doc.redisfans.com/key/ttl.html

Script

常用命令:http://redisdoc.com/script/eval.html

Redis安装

安装

首先,到redis官网找到要安装的redis版本,https://redis.io/download,我们这里选用v4.0.11,依次执行下面命令:

# wget http://download.redis.io/releases/redis-4.0.11.tar.gz
# tar xzf redis-4.0.11.tar.gz
# cd redis-4.0.11
# make

到此安装完成,然后可以通过make test测试编译状态

# make test

无报错完成编译应该会有这样的输出:

报错:需要tcl 8.5以上来运行redis test

You need tcl 8.5 or newer in order to run the Redis test

make: *** [test] Error 1

下面安装tcl8.6.1:

# wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz
# sudo tar xzvf tcl8.6.1-src.tar.gz
# cd tcl8.6.1/unix/
# sudo ./configure
# sudo make
# sudo make install 

再次运行make test,没问题之后,运行最后一步,完成安装:

# make install

直接启动:

# ./redis-server ../redis.conf

后台启动redis,只需修改redis.conf配置文件的daemonize yes,再次启动即可。

安装启动相关命令

启动redis服务器:

# ./redis-server ../redis.conf

停止redis服务:

# ./redis-cli shutdown

连接本地启动好的redis:

# redis-cli

根据ip端口连接redis:

# redis-cli -h 127.0.0.1 -p 6379

查看当前是否设置了密码

127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""

设置密码

127.0.0.1:6379> config set requirepass 123456 //密码是123456
OK

使用总结

关于key

  • 建议key不要太长,不要超过1024字节,占用内存且会降低查询效率
  • 建议统一命名规则,例如:String:001:zhangsan:age

使用 bitmap 实现用户上线次数统计

  Bitmap 对于一些特定类型的计算非常有效。

  假设现在我们希望记录自己网站上的用户的上线频率,比如说,计算用户 A 上线了多少天,用户 B 上线了多少天,诸如此类,以此作为数据,从而决定让哪些用户参加 beta 测试等活动 —— 这个模式可以使用 http://doc.redisfans.com/string/setbit.html#setbit 和 http://doc.redisfans.com/string/bitcount.html#bitcount 来实现。

  比如说,每当用户在某一天上线的时候,我们就使用 http://doc.redisfans.com/string/setbit.html#setbit ,以用户名作为 key ,将那天所代表的网站的上线日作为 offset 参数,并将这个 offset 上的为设置为 1 。

  举个例子,如果今天是网站上线的第 100 天,而用户 peter 在今天阅览过网站,那么执行命令 SETBIT peter 100 1 ;如果明天 peter 也继续阅览网站,那么执行命令 SETBIT peter 101 1 ,以此类推。

  当要计算 peter 总共以来的上线次数时,就使用 http://doc.redisfans.com/string/bitcount.html#bitcount 命令:执行 BITCOUNT peter ,得出的结果就是 peter 上线的总天数。

  更详细的实现可以参考博文(墙外) http://blog.getspool.com/2011/11/29/fast-easy-realtime-metrics-using-redis-bitmaps/ 。

缓存

缓存一致性

  • 先更新库数据,再删除缓存

缓存击穿和缓存雪崩

分布式锁的实现

setnx+lua实现

public class RedisTool {

 private static final String LOCK_SUCCESS = "OK";
 private static final String SET_IF_NOT_EXIST = "NX";
 private static final String SET_WITH_EXPIRE_TIME = "PX";
 private static final Long RELEASE_SUCCESS = 1L;

 // 获取锁
 public static boolean getLock(Jedis jedis, String lockKey, String requestId, int expireTime) {

 String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);

 if (LOCK_SUCCESS.equals(result)) {
 return true;
 }
 return false;

 }

 // 释放锁
 public static boolean releaseLock(Jedis jedis, String lockKey, String requestId) {

 String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
 Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));

 if (RELEASE_SUCCESS.equals(result)) {
 return true;
 }
 return false;
 }
}

抢红包,秒杀的实现

incr+lua脚本实现

参考链接:

http://doc.redisfans.com

https://blog.csdn.net/liqingtx/article/details/60330555

更多信息可以关注我的个人博客:https://www.yizhuxiaozhan.site或https://userzhao.coding.me

也欢迎关注我的公众号:yizhuxiaozhan,二维码:

相关推荐

Docker集群管理之Docker Compose

前言:在上一篇《Docker集群管理之DockerMachine》中,我们通过源码分析了解了DockerMachine的工作原理,使用者可以通过DockerMachine的一条命令在任意支持的平...

使用Dockerfile build镜像

Docker映像可以看作是Docker容器的压缩包,包含了应用程序以及运行应用程序所需的依赖,容器是映像的运行时实例。一般构建镜像都是使用dockerfile进行构建而不是dockercommit,...

自建私有云相册:Docker一键部署Immich,照片视频备份利器

自建私有云相册:Docker一键部署Immich,照片视频备份利器前言随着人们手机、PC、平板等电子产品多样,我们拍摄和保存的照片和视频数量也在不断增加。如何高效地管理和备份这些珍贵的记忆成为了一个重...

docker容器的使用以及部署mysql

首先什么是docker官方:翻译:Docker是一个用于开发、发布和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分离,以便您可以快速交付软件。使用Docker,您可以像管理应...

自建Docker镜像加速服务,免费且简单,服务器VPS、NAS皆可用
自建Docker镜像加速服务,免费且简单,服务器VPS、NAS皆可用

写在前面:流程十分简单,有手就行,还请耐心看完。本文的实例仅做演示用,不久后将会删除,有需要的各位请自行搭建。免费实例如果15分钟内未收到入站流量,Render会关闭实例的网络服务。Render会在下次收到处理请求时重新启动该服务。Ren...

2025-05-24 15:40 mhr18

用了8年的方式-用 Docker 瞬间搭建本地开发环境

有些时候我们需要在本地搭开发环境,比如平时学习新技术的时候。或者有时候公司的项目需要在本地建一套类似的,方便调试修改。开发环境可能包括MySQL、Redis、Nginx、MQ、Elasticsea...

使用dockerfile构建docker镜像

准备工作购买vps使用ssh工具连接上1、更新系统aptupdate-y2、一键安装Dockercurl-fsSLhttps://get.docker.com-oget-docker.sh...

快速搭建 SpringCloud 微服务开发环境的脚手架

本文适合有SpringBoot和SpringCloud基础知识的人群,跟着本文可使用和快速搭建SpringCloud项目。本文作者:HelloGitHub-秦人HelloGitHub推出...

Docker Hub最全详解(图文全面总结)

DockerHubDockerHub是一个由Docker公司负责维护的公共注册中心,它包含了超过15000多个可用来下载和构建容器的Docker镜像。DockerHub作用Docker好比一个代...

Docker 命令详解

dockerimages—查看本地镜像命令dockerimages说明列出本地已下载的所有镜像及其标签、ID、大小等信息。适用场景查看本地镜像资源、准备删除或管理镜像时。常见用法docker...

Kylin安装Dify

cd/mntgitclonehttps://github.com/langgenius/dify.gitcp/mnt/dify/docker/.env.example/mnt/dif...

kali下对Docker的详细安装

Docker是渗透测试中必学不可的一个容器工具,在其中,我们能够快速创建、运行、测试以及部署应用程序。如,我们对一些漏洞进行本地复现时,可以使用Docker快速搭建漏洞环境,完成复现学习。注:本教程仅...

银河麒麟V10使用Docker方式部署应用

现在越来越多的企业级应用需要运行在国产化环境中,而银河麒麟V10是目前我碰到的最常用的服务器,在银河麒麟上部署应用有两种方式:使用二进制文件编译部署和使用Docker。关于使用二进制文件的方式...

Docker入门到精通超详细教程,Docker全家桶实战攻略

大家好,我是各位双生的武魂、随身老爷爷。从看到这篇内容开始,你就是被选定的天命骚年,将承担起学完docker教程的使命,本使命为单向契约,你可选择YES或者选择YES。正式学习之前,我先给大家做一下d...

【Docker 新手入门指南】第一章:前言

一、基本介绍Docker介绍Docker是基于Go语言开发的开源容器化平台,旨在实现“一次镜像,处处运行”。它通过将应用程序及其依赖环境(代码、运行时、系统工具、系统库等)打包成一个轻量级、可移...

取消回复欢迎 发表评论: