首页 > 数据库 >【心得】TP6 使用redis基础

【心得】TP6 使用redis基础

时间:2023-09-15 21:38:59浏览次数:41  
标签:缓存 name redis value public TP6 key 心得 options

在业务场景中,我们会面对一些对于不经常更改的数据,但是会频繁访问,会对数据库造成不必要的负载,以及对于一些高并发的处理我们都需要用到缓存的技术,目前主流使用的缓存有MemChached Redis等,当然我们也有TP框架自带的缓存。但是今天我给大家带来的是redis的基础使用。 image.png 第一步

安装redis

https://github.com/tporadowski/redis/releases

解压到你自己命名的磁盘 b.如何检验是否有安装,按住win+r,输入cmd,在输入进入DOC操作系统窗口。在操作窗口切换到安装redis的目录下

image.png

看到这个就说明安装好Redis了

redis-benchmark.exe #基准测试 redis-check-aof.exe # aof redischeck-dump.exe # dump redis-cli.exe # 客户端 redis-server.exe # 服务器 redis.windows.conf # 配置文件

配置REDIS到TP

<?php
// +----------------------------------------------------------------------
// | 缓存设置
// +----------------------------------------------------------------------
return [
    // 默认缓存驱动
    'default' => env('cache.driver', 'file'),
    // 缓存连接方式配置
    'stores'  => [
        'file' => [
            // 驱动方式
            'type'       => 'File',
            // 缓存保存目录
            'path'       => '',
            // 缓存前缀
            'prefix'     => '',
            // 缓存有效期 0表示永久缓存
            'expire'     => 0,
            // 缓存标签前缀
            'tag_prefix' => 'tag:',
            // 序列化机制 例如 ['serialize', 'unserialize']
            'serialize'  => [],
        ],
        // 配置Reids
        'redis'    =>    [
            'type'     => 'redis',
            'host'     => '127.0.0.1',
            'port'     => '6379',
            'password' => '123456',
            'select'   => '0',
            // 全局缓存有效期(0为永久有效)
            'expire'   => 0,
            // 缓存前缀
            'prefix'   => '',
            'timeout'  => 0,
        ],
    ],
];

开始调用

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2021 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <[email protected]>
// +----------------------------------------------------------------------
declare (strict_types = 1);

namespace think\cache\driver;

use think\cache\Driver;

/**
 * Redis缓存驱动,适合单机部署、有前端代理实现高可用的场景,性能最好
 * 有需要在业务层实现读写分离、或者使用RedisCluster的需求,请使用Redisd驱动
 *
 * 要求安装phpredis扩展:https://github.com/nicolasff/phpredis
 * @author    尘缘 <[email protected]>
 */
class Redis extends Driver
{
    /** @var \Predis\Client|\Redis */
    protected $handler;

    /**
     * 配置参数
     * @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'  => [],
    ];

    /**
     * 架构函数
     * @access public
     * @param array $options 缓存参数
     */
    public function __construct(array $options = [])
    {
        if (!empty($options)) {
            $this->options = array_merge($this->options, $options);
        }

        if (extension_loaded('redis')) {
            $this->handler = new \Redis;

            if ($this->options['persistent']) {
                $this->handler->pconnect($this->options['host'], (int) $this->options['port'], (int) $this->options['timeout'], 'persistent_id_' . $this->options['select']);
            } else {
                $this->handler->connect($this->options['host'], (int) $this->options['port'], (int) $this->options['timeout']);
            }

            if ('' != $this->options['password']) {
                $this->handler->auth($this->options['password']);
            }
        } elseif (class_exists('\Predis\Client')) {
            $params = [];
            foreach ($this->options as $key => $val) {
                if (in_array($key, ['aggregate', 'cluster', 'connections', 'exceptions', 'prefix', 'profile', 'replication', 'parameters'])) {
                    $params[$key] = $val;
                    unset($this->options[$key]);
                }
            }

            if ('' == $this->options['password']) {
                unset($this->options['password']);
            }

            $this->handler = new \Predis\Client($this->options, $params);

            $this->options['prefix'] = '';
        } else {
            throw new \BadFunctionCallException('not support: redis');
        }

        if (0 != $this->options['select']) {
            $this->handler->select((int) $this->options['select']);
        }
    }

    /**
     * 判断缓存
     * @access public
     * @param string $name 缓存变量名
     * @return bool
     */
    public function has($name): bool
    {
        return $this->handler->exists($this->getCacheKey($name)) ? true : false;
    }

    /**
     * 读取缓存
     * @access public
     * @param string $name    缓存变量名
     * @param mixed  $default 默认值
     * @return mixed
     */
    public function get($name, $default = null)
    {
        $this->readTimes++;
        $key   = $this->getCacheKey($name);
        $value = $this->handler->get($key);

        if (false === $value || is_null($value)) {
            return $default;
        }

        return $this->unserialize($value);
    }

    /**
     * 写入缓存
     * @access public
     * @param string            $name   缓存变量名
     * @param mixed             $value  存储数据
     * @param integer|\DateTime $expire 有效时间(秒)
     * @return bool
     */
    public function set($name, $value, $expire = null): bool
    {
        $this->writeTimes++;

        if (is_null($expire)) {
            $expire = $this->options['expire'];
        }

        $key    = $this->getCacheKey($name);
        $expire = $this->getExpireTime($expire);
        $value  = $this->serialize($value);

        if ($expire) {
            $this->handler->setex($key, $expire, $value);
        } else {
            $this->handler->set($key, $value);
        }

        return true;
    }

    /**
     * 自增缓存(针对数值缓存)
     * @access public
     * @param string $name 缓存变量名
     * @param int    $step 步长
     * @return false|int
     */
    public function inc(string $name, int $step = 1)
    {
        $this->writeTimes++;
        $key = $this->getCacheKey($name);

        return $this->handler->incrby($key, $step);
    }

    /**
     * 自减缓存(针对数值缓存)
     * @access public
     * @param string $name 缓存变量名
     * @param int    $step 步长
     * @return false|int
     */
    public function dec(string $name, int $step = 1)
    {
        $this->writeTimes++;
        $key = $this->getCacheKey($name);

        return $this->handler->decrby($key, $step);
    }

    /**
     * 删除缓存
     * @access public
     * @param string $name 缓存变量名
     * @return bool
     */
    public function delete($name): bool
    {
        $this->writeTimes++;

        $key    = $this->getCacheKey($name);
        $result = $this->handler->del($key);
        return $result > 0;
    }

    /**
     * 清除缓存
     * @access public
     * @return bool
     */
    public function clear(): bool
    {
        $this->writeTimes++;
        $this->handler->flushDB();
        return true;
    }

    /**
     * 删除缓存标签
     * @access public
     * @param array $keys 缓存标识列表
     * @return void
     */
    public function clearTag(array $keys): void
    {
        // 指定标签清除
        $this->handler->del($keys);
    }

    /**
     * 追加TagSet数据
     * @access public
     * @param string $name  缓存标识
     * @param mixed  $value 数据
     * @return void
     */
    public function append(string $name, $value): void
    {
        $key = $this->getCacheKey($name);
        $this->handler->sAdd($key, $value);
    }

    /**
     * 获取标签包含的缓存标识
     * @access public
     * @param string $tag 缓存标签
     * @return array
     */
    public function getTagItems(string $tag): array
    {
        $name = $this->getTagKey($tag);
        $key  = $this->getCacheKey($name);
        return $this->handler->sMembers($key);
    }

}

Redis一般常用命令如下

set set name 张三 设置键值 get get name 取出key值 del del name1 name2 删除一个或者多个键值 mset mset k1 k2 k3 v1 v2 v3 设置多个键值 rename rename key newkey 改键名 keys keys * 慎用(大型服务器,会dwon,消耗进程)keys k? 查找相应的key incr incr key 指定的key增加1,并返回加1之后的值 decr decr key 指定的key减1,并返回减1之后的值 append append key value 把value 追加到key的原值后面 – – – hset hset key field value 将哈希表 key 中的字段 field 的值设为 value 。(场景:添加用户信息) hmset hmset key field1 value1 [field 2 vaue2] 同时将多个 field-value (域-值)对设置到哈希表 key 中。 hget hget key field 获取存储在哈希表中key的指定字段的值 hmget hmget key field1 field2 获取key的选择字段和值 hkeys hkeys key 查对应的key中所有的field hlen hlen key 获取key的长度 hdel hdel key field 删除key中的field与值 hexists hexists key field 查看哈希表 key 中,指定的字段是否存在。 – – – lpush lpush key value [value2] 将一个或多个值插入到列表头部 rpush rpush key value [valus2] 在列表中添加一个或多个值 lindex lindex key index 通过索引获取列表中的元素 llen llen key 获取列表长度 lpop lpop key 左删除并返回值 rpop rpop key 右删除并返回值 – – – sadd sadd key member1 [member2] 向集合添加一个或多个成员,集合里面相同的值的个数值算一个(应用场景:标签,社交等) smembers smembers key 返回集合中的所有成员 srem srem key value1 value2 用于移除集合中的一个或多个成员元素,不存在的成员元素会被忽略。 sismember sismember key value 判断value是否存在集合key中,存在返回1,不存在返回0. smove smove key1 key2 value 将集合key1里面的value值删除并添加到集合key2中,如果key1里面value的值不存在,命令就不执行,返回0。如果key2已经存在value的值,那key1的集合直接执行删除value值。 sinter sinter key1 key2 key1 key2的交集,返回key1 key2的相同value。 sdiff sdiff key1 key2 key1 key2的差集,举例:key1集合{1,2,3} key2集合{2,3,4} .key1 减去 key2={1},key2减去key1={4}(相减去相同的) – – – zadd zadd key score1 value1 score2 value2 向有序集合添加一个或多个成员,或者更新已存在成员的分数(应用场景:排名、社交等) zcard zcard key 统计key 的值的个数 zrange zrange key start stop withscores zrange key start stop withscores 把集合排序后,按照分数排序打印出来 zrevrange zrevrange key start stop withscores 把集合降序排列

好了今天的内容就这些,后续我还会继续给大家分享Redis的深度用法的

标签:缓存,name,redis,value,public,TP6,key,心得,options
From: https://blog.51cto.com/u_16240159/7486573

相关文章

  • Redis7 10大数据类型(Redis集合)
    一、常用二、单值多value,且无重复三、案例SADDkeymember[member...]添加元素SMEMBERSkey遍历集合中的所有元素SISMEMBERkeymember判断元素是否在集合中SREMkeymember[member...]删除元素scard获取集合里面的元素个数SRANDMEMBERkey[数字]从集合中随机展现......
  • linux上安装redis保姆级教程
    1、执行下面的命令下载redis:wgethttps://download.redis.io/releases/redis-6.2.6.tar.gz 2、解压tar-zxvfredis-6.2.6.tar.gz 3、安装gccyuminstallgcc-c++makemakeinstall  4、redis默认安装位置:/usr/local/bin配置文件所在目录:安装目录/redis/redis-......
  • 本地搭建的Redis集群中实现配置DB0到DB255
    要在本地搭建的Redis集群中实现配置DB0到DB255,需要执行以下步骤:1.编辑Redis配置文件(redis.conf):使用文本编辑器打开redis.conf文件,找到以下配置项:```#Setthenumberofdatabases.ThedefaultdatabaseisDB0,youcanselect#adifferentoneonaper-connect......
  • redis批量先查缓存再查数据库
    RedisUtil:/***批量查询缓存,若是缓存没有的数据再调用对应的方法查询数据,查询之后放入缓存*@paramprefix缓存前缀*@paramparams缓存参数*@paramcolumn缓存参数对应字段列名*@paramdataBaseFunction数据库查询方法*@return......
  • redis配置(二)
    1.redis扩展:redis服务可以使用相关程序写代码去连接服务.redis服务(可以理解为一个很屌的Socket服务端程序)________________________________________|||PHP扩展java相关客户端库调用python相关包调......
  • Redis SCAN:实现key的模糊匹配的科学方法
    目录scan基本介绍shell使用scan最基本的scan带匹配模式和count的scanjava中使用hscanscan基本介绍在使用redis的时候,我们经常涉及到这样的需求:模糊搜索key,即找出满足特定匹配模式的所有key。但是,如果使用像keys和hkyes这样的方法的话,当key的数量特别多时,效率会很慢,而且对线......
  • Redis高级客户端Lettuce详解
    Lettuce是一个高性能基于Java编写的Redis驱动框架,底层集成了ProjectReactor提供天然的反应式编程,通信框架集成了Netty使用了非阻塞IO,5.x版本之后融合了JDK1.8的异步编程特性,在保证高性能的同时提供了十分丰富易用的API,5.1版本的新特性如下:支持Redis的新增命令ZPOPMIN,ZPOPMAX,BZ......
  • 为什么我的Redis这么“慢”?
    为什么我的Redis这么“慢”?Redis作为内存数据库,拥有非常高的性能,单个实例的QPS能够达到10W左右。但我们在使用Redis时,经常时不时会出现访问延迟很大的情况,如果你不知道Redis的内部实现原理,在排查问题时就会一头雾水。很多时候,Redis出现访问延迟变大,都与我们的使用不当或......
  • redis-删除所有key
    删除所有Key,可以使用Redis的flushdb和flushall命令//删除当前数据库中的所有Keyflushdb//删除所有数据库中的keyflushall 如果要访问Redis中特定的数据库,使用下面的命令//下面的命令指定数据序号为0,即默认数据库redis-cli-n0keys"*"|xargsredis-cli-n0del ......
  • 本地缓存和Redis缓存
    Redis可以实现分布式的缓存,Map属于本地缓存,只能存在创建它的程序里Redis的缓存可以持久化,Map是内存对象,程序一重启数据就没了Redis缓存有过期机制,Map本身无此功能Redis可以处理每秒百万级的并发,是专业的缓存服务,Map只是一个普通的对象Redis可以用几十G内存来做缓存......