问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

thinkphp redis 怎么选择数据库

发布网友 发布时间:2022-04-06 02:53

我来回答

5个回答

懂视网 时间:2022-04-06 07:14

下面由thinkphp教程栏目给大家介绍ThinkPHP6多例Redis类实现,希望对需要的朋友有所帮助!

在Thinkphp项目中封装一个Redis多库单例操作类

1.操作前的准备

如果没有安装phpredis模块那么先执行

composer require predis/predis

2.配置Redis连接信息

在appconfigcache.php中配置

'redis' => [
 // 驱动方式
 'type' => 'redis',
 // 连接地址
 'host' => Env::get('redis.host'),
 // 端口
 'port' => Env::get('redis.port'),],

更多配置参考

/**
 * 配置参数
 * @var array
 */protected $options = [
 'host' => '127.0.0.1',
 'port' => 6379,
 'password' => '',
 'select' => 0,
 'timeout' => 0,
 'expire' => 0,
 'persistent' => false,
 'prefix' => '',
 'tag_prefix' => 'tag:',
 'serialize' => [],];

在.env中配置连接信息

[REDIS]host = 127.0.0.1
port = 6379

3.编写代码

在appcommon下创建文件Redis.php

<?phpnamespace appcommon;use thinkfacadeConfig;use thinkcachedriver
edis as ThinkRedis;class Redis extends ThinkRedis{
 /**
 * @var int
 */
 protected $hash;

 /**
 * @var array
 */
 protected static $instance = [];

 /**
 * Redis constructor.
 * @param $db
 */
 private function __construct($db)
 {
 $options = Config::get('cache.stores.redis');
 $options['select'] = $db;
 $this->hash = $db;
 $this->options = array_merge($this->options, $options);
 parent::__construct();
 }

 private function __clone()
 {
 }

 /**
 * @param int $db
 * @return PredisClient|Redis
 */
 public static function instance($db = 0)
 {
 if (! isset(self::$instance[$db])) {
  self::$instance[$db] = new self($db);
 }

 return self::$instance[$db];
 }

 public function __destruct()
 {
 self::$instance[$this->hash]->close();
 unset(self::$instance[$this->hash]);
 }}

4.使用方式

use appcommonRedis;

$redis = Redis::instance(4);
$redis->hSet('user:1', 'userName', 'admin');

Redis::instance(1)->hSet('user', 'name', 'admin1');
Redis::instance(2)->hSet('user', 'name', 'admin2');
Redis::instance(3)->hSet('user', 'name', 'admin3');

更多使用方法请参考 redis命令手册

热心网友 时间:2022-04-06 04:22

1、redis 中的每一个数据库,都由一个 redisDb 的结构存储。其中,redisDb.id 存储着 redis 数据库以整数表示的号码。redisDb.dict 存储着该库所有的键值对数据。redisDb.expires 保存着每一个键的过期时间。

2、当redis 服务器初始化时,会预先分配 16 个数据库(该数量可以通过配置文件配置),所有数据库保存到结构 redisServer 的一个成员 redisServer.db 数组中。当我们选择数据库 select number 时,程序直接通过 redisServer.db[number] 来切换数据库。有时候当程序需要知道自己是在哪个数据库时,直接读取 redisDb.id 即可。

3、既然我们知道一个数据库的所有键值都存储在redisDb.dict中,那么我们要知道如果找到key的位置,就有必要了解一下dict 的结构了:

typedef struct dict {

// 特定于类型的处理函数
dictType *type;

// 类型处理函数的私有数据
void *privdata;

// 哈希表(2个)
dictht ht[2];

// 记录 rehash 进度的标志,值为-1 表示 rehash 未进行
int rehashidx;

// 当前正在运作的安全迭代器数量
int iterators;
} dict;
由上述的结构可以看出,redis 的字典使用哈希表作为其底层实现。dict 类型使用的两个指向哈希表的指针,其中 0 号哈希表(ht[0])主要用于存储数据库的所有键值,而1号哈希表主要用于程序对 0 号哈希表进行 rehash 时使用,rehash 一般是在添加新值时会触发,这里不做过多的赘述。所以redis 中查找一个key,其实就是对进行该dict 结构中的 ht[0] 进行查找操作。

4、既然是哈希,那么我们知道就会有哈希碰撞,那么当多个键哈希之后为同一个值怎么办呢?redis采取链表的方式来存储多个哈希碰撞的键。也就是说,当根据key的哈希值找到该列表后,如果列表的长度大于1,那么我们需要遍历该链表来找到我们所查找的key。当然,一般情况下链表长度都为是1,所以时间复杂度可看作o(1)。

二、当redis 拿到一个key 时,如果找到该key的位置。

了解了上述知识之后,我们就可以来分析redis如果在内存找到一个key了。

1、当拿到一个key后, redis 先判断当前库的0号哈希表是否为空,即:if (dict->ht[0].size == 0)。如果为true直接返回NULL。

2、判断该0号哈希表是否需要rehash,因为如果在进行rehash,那么两个表中者有可能存储该key。如果正在进行rehash,将调用一次_dictRehashStep方法,_dictRehashStep 用于对数据库字典、以及哈希键的字典进行被动 rehash,这里不作赘述。

3、计算哈希表,根据当前字典与key进行哈希值的计算。

4、根据哈希值与当前字典计算哈希表的索引值。

5、根据索引值在哈希表中取出链表,遍历该链表找到key的位置。一般情况,该链表长度为1。

6、当 ht[0] 查找完了之后,再进行了次rehash判断,如果未在rehashing,则直接结束,否则对ht[1]重复345步骤。

到此我们就找到了key在内存中的位置了。

热心网友 时间:2022-04-06 05:40

再配置一个数据库连接,设置默认数据库是redis,第二个数据库可选使用,比如:
$model = new model();
$data = $model->db(1,'db2')->query($sql);//db2是在配置里的另外一个数据库连接

热心网友 时间:2022-04-06 07:15

网页链接

你可以看这里面的操作

热心网友 时间:2022-04-06 09:06

__construct()添加
'dbindex' => C('REDIS_DBINDEX') ? C('REDIS_DBINDEX') : 0
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
做鼻小柱用什么材料好? 谁有visio2003版 WIN7 64位啊,有的话发个连接 中山东区怎样坐车去珠海 ...忘记了ID密码,苹果官网发来一个这样的网址,请问怎么操作? 苹果id被锁定26天后可以重设密码 快手发作品配的说说大全 四年级语文爬山虎的脚教案 工作井内有哪些设备 南方电网检查井内设有排管吗 安装电缆施工 thinkphp 怎么开启redis拓展 thinkphp+redis-TP框架里怎么扩展redis操作 thinkphp中的redis怎么用啊 thinkphp中使用redis tinkphp5.1手册命名规范中类的文件名均以命名空间定义怎么理解? C++命名空间,疑惑 请问xhtml中开头的命名空间是怎样理解的,为什么每次写的都是同样一个名字? C++标准命名空间 什么是.NET Framework的命名空间?命名空间为什么要分层次? c#中的命名空间用和不用有什么区别 嵌套命名空间它的含义是什么,怎么去理解?? C#中&quot;命名空间&quot;的意思和功能? As3 达人请进来,我刚学到命名空间,对概念不是很理解,我送点分数给你们,嘿嘿,先到先得 Python之禅中的namespace怎么理解 模块与命名空间 C++命名空间是什么? 学校学了一个月C语言,然后开始学c#,感觉对c#的命名空间和类表示不能理解,有通俗一点的解释吗 C++命名空间到底有什么作用?请举例说明 c#中什么叫做命名空间? 1】 命名空间里可以包容 命名空间? 2】 类一定在 命名空间里面; 3】 命名空间里面 可以 声明变量? thinkphp怎么使用redius Thinkphp5怎么扩展Redis数据库,实现Redis的CURD操作 ThinkPHP 框架,redis不能用,extension_loaded(&#39;redis&#39;) 返回false thinkphp redis存入session怎么调用 thinkphp 用redis 怎么选择数据库? 如何在thinkphp3.2.3里面设置redis thinkphp怎么配置redis密码 thinkphp6 index.php多应用时为什么自定义的入口无法访问多应用? 关于thinkphp开发的几种规范 Laravel 数据库id设置是自增可save新增sql出来的id为什么是字符串 laravel差入数据库主键自增怎么写 laravel怎么increment多个字段 laravel 怎么获取要修改的信息 使用laravel 的多对多的多态关联父表主键必须是叫做&#39;id&#39;吗 在Laravel框架中,比如我进行注册,判断两次密码是否一致,但是我的重复密码又不能插入到数据库中 laravel 伪静态怎么给参数命名 steam错误代码118真正解决方法 怎么把钉钉里面刷视频的小程序删除 如何卸载teambition客户端 如何注销teambition账号