'components' => [
'cache' => [
'class' => 'yii\redis\Cache',
],
],
只需要在配置文件中添加 keyPrefix 屬性即可:
'components' => [
'cache' => [
'class' => 'yii\redis\Cache',
'keyPrefix' => 'webapp:'
],
]
'components' => [
'redis' => [
'class' => 'yii\redis\Connection',
'hostname' => 'localhost',
'port' => 6379,
'database' => 0,
],
],
這樣就沒有辦法實現(xiàn)自動加前綴,只能自己去實現(xiàn)。
如果是我的話,我會單獨寫一個Redis的helper類,只在這個 Redis helper類中調(diào)用 \Yii::$app->redis 組件。
class RedisBase
{
/**
* 這個方法中給 key 增加前綴
* 所有與key相關(guān)的方法都要調(diào)用這個方法
* @param $key
* @return string
*/
protected static function buildKey($key)
{
return \Yii::$app->params['redis.prefix'] . $key;
}
/**
* @return \yii\redis\Connection
*/
protected static function getRedis()
{
return \Yii::$app->redis;
}
/**
* # exists key
*
* 檢查key是否存在
* @param string $key
* @return bool
*/
public static function exists($key)
{
$key = self::buildKey($key);
$redis = self::getRedis();
return (bool) $redis->exists($key);
}
/**
* # del key [key2 key3 …]
*
* 刪除指定數(shù)據(jù)
*
* @param string $key
* @param bool $strict
* 是否使用嚴格模式
* true: 當指定鍵不存在時,返回false
* false: 當指定鍵不存在時,但會true
* @return bool
*/
public static function del($key, $strict = false)
{
$key = self::buildKey($key);
// 非嚴格模式,當指定鍵不存在時,但會true
if (! $strict && ! self::exists($key)) return true;
$redis = self::getRedis();
return (bool) $redis->del($key);
}
/**
* # expire key seconds
*
* 設(shè)置 key在seconds秒后過期
*
* @param $key
* @param $seconds
* @return bool
*/
public static function expire($key, $seconds)
{
$key = self::buildKey($key);
$redis = self::getRedis();
return (bool) $redis->expire($key, $seconds);
}
/**
* # ttl key
*
* 大于等于0時,表示剩余過期秒數(shù)
* -1 表示key存在,并且沒有過期時間
* -2 表示key已經(jīng)不存在了
*
* 查看key的剩余過期時間
* @param $key
* @return int
*/
public static function ttl($key)
{
$key = self::buildKey($key);
$redis = self::getRedis();
return (int) $redis->ttl($key);
}
/**
* # dbsize
*
* 當前db 鍵的總數(shù)量
* @return int
*/
public static function dbSize()
{
$redis = self::getRedis();
return (int) $redis->dbsize();
}
// ... 其他redis基礎(chǔ)方法
}
class RedisString extends RedisBase
{
/**
* # SET key value options
*
* 設(shè)置指定 key 的值
*
* @param $key
* @param $value
* @param array $options
*
* EX seconds -- 設(shè)置指定key的過期時間,以秒為單位
* PX milliseconds -- 設(shè)置指定key的過期時間,以毫秒為單位
* NX -- 只有在key不存在的情況下才設(shè)置.
* XX -- 只有在key存在的情況下才設(shè)置.
*
* eg: ['NX', 'EX', '3600']
*
* @return bool
*/
public static function set($key, $value, array $options = [])
{
$key = self::buildKey($key);
$redis = self::getRedis();
$param = array_merge([$key, $value], $options);
return (bool) call_user_func_array([$redis, 'set'], $param);
}
/**
* # GET key
*
* 獲取指定 key 的值。
* @param $key
* @return string
*/
public static function get($key)
{
$key = self::buildKey($key);
$redis = self::getRedis();
return $redis->get($key);
}
// ...其他String類型的方法
}
class RedisSet extends RedisBase
{
/**
* # SADD key member1 [member2]
*
* 向集合添加一個或多個成員
*
* @param $key
* @param $members
* @return int 成功添加數(shù)量
*/
public static function sAdd($key, $members)
{
$key = self::buildKey($key);
$redis = self::getRedis();
// php >= 5.6
return (int) $redis->sadd($key, ...(array) $members);
// 通用寫法
// $params = array_merge([$key], (array) $members);
// return (int) call_user_func_array([$redis, 'sadd'], $params);
}
/**
* # SREM key member1 [member2]
*
* 移除集合中一個或多個成員
* @param $key
* @param $members
* @return int
*/
public static function sRem($key, $members)
{
$key = self::buildKey($key);
$redis = self::getRedis();
$params = array_merge([$key], (array) $members);
return (int) call_user_func_array([$redis, 'srem'], $params);
}
/**
* # SISMEMBER key member
*
* 判斷 member 元素是否是集合 key 的成員
* @param $key
* @param $member
* @return bool
*/
public static function sIsMember($key, $member)
{
$key = self::buildKey($key);
$redis = self::getRedis();
return (bool) $redis->sismember($key, $member);
}
/**
* # SMEMBERS key
*
* 返回集合中的所有成員
* @param $key
* @return array
*/
public static function sMembers($key)
{
$key = self::buildKey($key);
$redis = self::getRedis();
return $redis->smembers($key);
}
/**
* # SCARD key
*
* 獲取集合的成員數(shù)
* @param $key
* @return bool
*/
public static function sCard($key)
{
$key = self::buildKey($key);
$redis = self::getRedis();
return (int) $redis->scard($key);
}
// ...其他Set類型的方法
class RedisSortedSet extends RedisBase
{
/**
* # ZADD key score1 member1 [score2 member2]
*
* 向有序集合添加一個或多個成員,或者更新已存在成員的分數(shù)
* @param $key
* @param array $options
* [
* 'value1' => score1,
* 'value2' => score2,
* 'value3' => score3,
* ]
*
* @return int
*/
public static function zAdd($key, array $options)
{
$key = self::buildKey($key);
$redis = self::getRedis();
$param = [$key];
foreach ($options as $value => $score) {
$param[] = $score;
$param[] = $value;
}
return (int) call_user_func_array([$redis, 'zadd'], $param);
}
// ...其他SortedSet類型的方法
}
class RedisList extends RedisBase
{
// ...方法省略
}
class RedisHash extends RedisBase
{
// ...方法省略
}
1.在調(diào)用redis的原始方法前,可以對數(shù)據(jù)進行預(yù)處理
2.后期維護方便,若想修改,只需要修改這里的方法即可
3.方便添加一些注釋信息
4.這種方法對IDE更友好,可以直接跳轉(zhuǎn)到這個類中的方法,若處處使用\Yii::$app->redis,則會比較難維護
另外,關(guān)于Redis的一些數(shù)據(jù)類型,可以查看Redis學習筆記 - 數(shù)據(jù)類型與API
用
set names utf8
設(shè)置一下編碼試試
JWT 認證應(yīng)該帶上時間戳(或者其他可以表明請求獨立性的東西),每次發(fā)送請求的時候都計算一次 token,后端會拿到包含時間戳的參數(shù)列表和 token,然后根據(jù)它們也計算一個 token,如果兩邊一致,則 token 驗證通過。
因此 token 本身就是要每次都重新計算一次的,你在前端存儲 token 是沒有太大價值的,當然可以用于記錄日志,但這并沒有太多意義。
把rbac數(shù)據(jù)整理好之后,用Treeview的js插件去渲染出來。
采用直接替換修改字符的方式解決問題,這樣就不涉及排序問題了
@echo off & color 3a & setlocal enabledelayedexpansion
title 批量替換文件(文件夾)名
echo 此批處理可批量替換本文件所在文件夾下所有文件(文件夾)名。
echo.
set /p str1= 請輸入要替換的文件(文件夾)名字符串(可替換空格):
set /p str2= 請輸入替換后的文件(文件夾)名字符串(去除則直接回車):
echo.
echo 正在替換文件名……
for /f "delims=" %%a in ('dir /a-d /s /b') do (
if "%%~nxa" neq "%~nx0" (
set "f=%%~na"
set "f=!f:%str1%=%str2%!"
if not exist "%%~dpa!f!%%~xa" ren "%%a" "!f!%%~xa"
)
)
echo 替換文件名完成
echo.
echo 正在替換文件夾名……
:folder
set n=0
for /f "delims=" %%i in ('dir /ad /s /b ^|find "%str1%"') do (
set t=%%~ni
set t=!t:%str1%=%str2%!
if not exist "%%~dpi!t!" ren "%%i" "!t!" 2>nul
set /a n+=1
)
if "!n!" neq "0" goto folder
echo 替換文件夾名完成
pause你建一張表, 注冊成功之后存入ip。 下次注冊的時候檢測一下60分鐘內(nèi)是否已經(jīng)注冊, 如果沒有就可以注冊。
分頁方式應(yīng)由數(shù)據(jù)提供方定義
需要請對方開出對應(yīng)的分頁串接方式才行
瀏覽器緩存問題,試試CTRL+F5刷新一下。 還有就是。。修改配置文件后有沒有 nginx -s reload
犯了個非常愚蠢的錯誤,因為定義的post應(yīng)該合理的用post進行請求(laravel是個好框架:)
1,自己生成6位的短信驗證碼,生成一個rediskey,保存這個短信驗證碼,并給個有效時間,這時也把rediskey告訴客戶端;
2,調(diào)用短信服務(wù)商api發(fā)送短信,
3,客戶端提交時,post攜帶rediskey,輸入的短信驗證碼,后臺根據(jù)rediskey調(diào)出redis存儲的短信驗證碼與輸入的驗證碼比對,通過,刪除這個rediskey。
提示不是很明顯了嗎, 你不是該紅包發(fā)送者....
編碼問題
標題欄右鍵,選擇options
Asia/Shanghai
更全的可以看這個:http://php.net/manual/zh/time...
Connection: Close表示當前連接的請求處理完畢后斷掉。不是直接斷開
head有2種
1.request的head是給服務(wù)端看的,php通過get_header()獲取
2.response的head是給客戶端看的,php通過header()設(shè)置
所以header('Connection: Close');關(guān)php-fpm什么事
Connection可能不常用
常用的是header('Location:http://xxxxx.com/');
服務(wù)端是沒有跳轉(zhuǎn)這種行為的,只能通過head告知客戶端我要跳轉(zhuǎn)。
要注意的是header不代表結(jié)束執(zhí)行,所以用header進行跳轉(zhuǎn)時要使用exit。
代碼如下:
header('Location:http://xxxxx.com/');exit;暫時沒有,官方應(yīng)該是為了保護用戶,所以才移到button上的
前后端分離,項目不大的話就是直接調(diào)用后端API,只要能提供API,用什么語言無所謂。
docker唄
你只需要一個webstorm IDE就行了
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓領(lǐng)域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務(wù)負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。