新聞中心
利用Redis實現(xiàn)前臺數(shù)據(jù)獲取

Redis是一種快速、可擴(kuò)展、開源、高性能的數(shù)據(jù)庫解決方案,它以鍵值對的方式存儲數(shù)據(jù),并支持多種數(shù)據(jù)結(jié)構(gòu),如字符串、列表、、有序和哈希表等。在Web應(yīng)用程序中,Redis可被用于緩存和session存儲,也可被用作隊列和發(fā)布/訂閱系統(tǒng)等。
在這篇文章中,我們將討論如何利用Redis實現(xiàn)前臺數(shù)據(jù)獲取。我們將介紹如何在PHP中使用Redis擴(kuò)展程序,以及如何將其集成到一個簡單的Web應(yīng)用程序中,以便從Redis中檢索和顯示數(shù)據(jù)。
我們需要確保Redis服務(wù)器已經(jīng)在本地計算機(jī)上安裝并運行。我們可以通過redis-cli程序來測試Redis服務(wù)器是否正常運行。在終端中運行以下命令:
“`
$ redis-cli ping
“`
如果Redis服務(wù)器正在運行,則應(yīng)該看到以下輸出:
“`
PONG
“`
接下來,我們需要在PHP中安裝Redis擴(kuò)展程序。我們可以通過PECL安裝器來安裝Redis擴(kuò)展,如下所示:
“`
$ sudo pecl install redis
“`
完成安裝后,我們需要在PHP配置文件中啟用Redis擴(kuò)展。在Ubuntu上,該文件通常位于/etc/php/7.x/cli/php.ini或/etc/php/7.x/apache2/php.ini中。我們需要在該文件中添加以下行:
“`
extension=redis.so
“`
保存并關(guān)閉該文件,然后重啟Web服務(wù)器和PHP FPM,以確保新配置生效。
接下來,我們將創(chuàng)建一個簡單的PHP腳本來演示如何利用Redis實現(xiàn)前臺數(shù)據(jù)獲取。在Web服務(wù)器上創(chuàng)建一個index.php文件,然后將以下代碼添加到該文件中:
“`
// 連接到Redis服務(wù)器
$redis = new Redis();
$redis->connect(‘localhost’, 6379);
// 設(shè)置一個鍵值對
$redis->set(‘name’, ‘Redis’);
// 獲取一個鍵的值
$name = $redis->get(‘name’);
// 輸出結(jié)果
echo ‘Welcome to ‘ . $name . ‘!’;
?>
“`
在以上代碼中,我們首先連接到Redis服務(wù)器,然后將一個鍵值對存儲在Redis中。我們?nèi)缓髲腞edis中檢索該鍵的值,并將其顯示在前端頁面上。這樣,我們就成功地利用Redis實現(xiàn)了前臺數(shù)據(jù)獲取。
在本文中,我們介紹了如何使用Redis擴(kuò)展程序和PHP,在Web應(yīng)用程序中利用Redis實現(xiàn)前臺數(shù)據(jù)獲取。我們首先安裝了Redis服務(wù)器和Redis擴(kuò)展,并在PHP配置文件中啟用了該擴(kuò)展。然后,我們創(chuàng)建了一個簡單的PHP腳本來演示如何利用Redis存儲和檢索數(shù)據(jù),并將其顯示在前端頁面上。Redis的高性能和可擴(kuò)展性使其成為Web應(yīng)用程序的理想選擇,特別是對于需要在前臺快速檢索和顯示數(shù)據(jù)的應(yīng)用程序。
相關(guān)問題拓展閱讀:
- 如何獲取redis管理的session
- 三分鐘讀懂redis數(shù)據(jù)庫
如何獲取redis管理的session
0.什么是Redis
Redis是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API
—
1.與其他用戶狀態(tài)保存方案比較
一般開發(fā)中用戶狀態(tài)使用session或者cookie,兩種方式各種孝巧利弊。
Session:在InProc模式下容易丟失,并且引起并發(fā)問題。如果使用SQLServer或者SQLServer模式又消耗了性能
Cookie則容易將一些用戶信息暴露,加解密同樣也消耗了性能。
Redis采用這樣的方案巧納鍵解決了幾個問題,
1.Redis存取速度快。
2.用戶數(shù)據(jù)不容易丟失。
3.用戶多的情況下容易支持集群。
4.能夠查看在線用戶。
5.能夠?qū)崿F(xiàn)用戶一處登錄。(通過代碼實現(xiàn),后續(xù)介紹)
6.支持持久化。(當(dāng)然可能沒什么用)
2.實現(xiàn)思路
1.我們知道session其實是在cookie中保存了一個sessionid,用戶每次訪問都將sessionid發(fā)給服務(wù)器,服務(wù)器通過ID查找用戶對應(yīng)的狀態(tài)數(shù)據(jù)。
在這里我的處理方式也是在cookie中定義一個sessionid,程序需要取得用戶狀態(tài)時將sessionid做為key在Redis中查找。
2.同時session支持用戶在一定時間不訪問將session回收。
借用Redis中Keys支持過期時間的特性支持這個功能,但是在續(xù)期方面需要程序自行攔截請求調(diào)用這個方法(demo有例子)
下面開始代碼說明
3.Redis調(diào)用接口
首先引用ServiceStack相關(guān)DLL。
在web.config添加配置,這個配置用來設(shè)置Redis調(diào)用茄中地址每臺服務(wù)用【,】隔開。主機(jī)寫在之一位
1
2
3
4
5
6
初始化配置
static Managers()
{
string sessionRedis= ConfigurationManager.AppSettings;
string timeOut = ConfigurationManager.AppSettings;
if (string.IsNullOrEmpty(sessionRedis))
{
throw new Exception(“web.config 缺少配置SessionRedis,每臺Redis之間用,分割.之一個必須為主機(jī)”);
}
if (string.IsNullOrEmpty(timeOut)==false)
{
TimeOut = Convert.ToInt32(timeOut);
}
var host = sessionRedis.Split(char.Parse(“,”));
var writeHost = new string { host };
var readHosts = host.Skip(1).ToArray();
ClientManagers = new PooledRedisClientManager(writeHost, readHosts, new RedisClientManagerConfig
{
MaxWritePoolSize = writeReadCount,//逗寫地鏈接池鏈接數(shù)
MaxReadPoolSize = writeReadCount,//逗讀地鏈接池鏈接數(shù)
AutoStart = true
});
}
為了控制方便寫了一個委托
///
/// 寫入
///
///
///
///
public F TryRedisWrite(Func doWrite)
{
PooledRedisClientManager prcm = new Managers().GetClientManagers();
IRedisClient client = null;
try
{
using (client = prcm.GetClient())
{
return doWrite(client);
}
}
catch (RedisException)
{
throw new Exception(“Redis寫入異常.Host:” + client.Host + “,Port:” + client.Port);
}
finally
{
if (client != null)
{
client.Dispose();
}
}
}
一個調(diào)用的例子其他的具體看源碼
///
/// 以Key/Value的形式存儲對象到緩存中
///
/// 對象類別
/// 要寫入的
public void KSet(Dictionary value)
{
Func fun = (IRedisClient client) =>
{
client.SetAll(value);
return true;
};
TryRedisWrite(fun);
}
4.實現(xiàn)Session
按上面說的給cookie寫一個sessionid
///
/// 用戶狀態(tài)管理
///
public class Session
{
///
/// 初始化
///
///
public Session(HttpContextBase _context)
{
var context = _context;
var cookie = context.Request.Cookies.Get(SessionName);
if (cookie == null || string.IsNullOrEmpty(cookie.Value))
{
SessionId = NewGuid();
context.Response.Cookies.Add(new HttpCookie(SessionName, SessionId));
context.Request.Cookies.Add(new HttpCookie(SessionName, SessionId));
}
else
{
SessionId = cookie.Value;
}
}
}
去存取用戶的方法
///
/// 獲取當(dāng)前用戶信息
///
///
///
public object Get() where T:class,new()
{
return new RedisClient().KGet(SessionId);
}
///
/// 用戶是否在線
///
///
public bool IsLogin()
{
return new RedisClient().KIsExist(SessionId);
}
///
/// 登錄
///
///
///
public void Login(T obj) where T : class,new()
{
new RedisClient().KSet(SessionId, obj, new TimeSpan(0, Managers.TimeOut, 0));
}
6.續(xù)期
默認(rèn)用戶沒訪問超過30分鐘注銷用戶的登錄狀態(tài),所以用戶每次訪問都要將用戶的注銷時間推遲30分鐘
這需要調(diào)用Redis的續(xù)期方法
///
/// 延期
///
///
///
public void KSetEntryIn(string key, TimeSpan expiresTime)
{
Func fun = (IRedisClient client) =>
{
client.ExpireEntryIn(key, expiresTime);
return false;
};
TryRedisWrite(fun);
}
封裝以后
///
/// 續(xù)期
///
public void Postpone()
{
new RedisClient().KSetEntryIn(SessionId, new TimeSpan(0, Managers.TimeOut, 0));
}
這里我利用了MVC3中的ActionFilter,攔截用戶的所有請求
namespace Test
{
public class SessionFilterAttribute : ActionFilterAttribute
{
///
/// 每次請求都續(xù)期
///
///
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
new Session(filterContext.HttpContext).Postpone();
}
}
}
在Global.asax中要注冊一下
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new SessionFilterAttribute());
}
protected void Application_Start()
{
RegisterGlobalFilters(GlobalFilters.Filters);
}
5.調(diào)用方式
為了方便調(diào)用借用4.0中的新特性,把Controller添加一個擴(kuò)展屬性
public static class ExtSessions
{public static Session SessionExt(this Controller controller)
{
return new Session(controller.HttpContext);
}
}
調(diào)用方法
public class HomeController : Controller
{
public ActionResult Index()
{
this.SessionExt().IsLogin();
return View();
}
三分鐘讀懂redis數(shù)據(jù)庫
redis是一個key-value存儲系統(tǒng)。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set()、zset(sorted set –有序)和hash(哈希類型)。這些數(shù)據(jù)類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎(chǔ)上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中。區(qū)別的是redis會周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎(chǔ)上實氏物現(xiàn)了master-slave(主從)同步。
1. 使用Redis有哪些好處?
(1) 速度快,因為數(shù)據(jù)存在內(nèi)存中,類似于HashMap,HashMap的優(yōu)勢就是查找和操作的時間復(fù)雜度都是O(1)
(2) 支持豐富數(shù)據(jù)類型,支持string,list,set,sorted set,hash
(3) 支持事務(wù),操作都是原子性,所謂的原子性就是對數(shù)據(jù)的更改要么全部執(zhí)行,要么全部不執(zhí)行
(4) 豐富的特性:可用于緩存,消息,按key設(shè)置過期時間,過期后將會自動刪除
2. redis相比memcached有哪些優(yōu)勢?
(1) memcached所有的值均是簡單的字符串,redis作為其替代者,支持更為豐富的數(shù)據(jù)類型
(2) redis的速度比memcached快很多
(3) redis可以持久化其數(shù)據(jù)
3. redis常見性能問題和解決方案:
(1) Master更好不要做任何持久化工作,如RDB內(nèi)存快照和AOF日志文件
(2) 如果數(shù)據(jù)比較重要,某個Slave開啟AOF備份數(shù)據(jù),策略設(shè)置為每秒同步一次
(3) 為了主從復(fù)制的速度和連接的穩(wěn)定性,Master和Slave更好在同一個局域網(wǎng)內(nèi)
(4) 盡量避免在壓力很大的主庫上增加從庫
(5) 主從復(fù)制不要用圖狀結(jié)構(gòu),用單向鏈表結(jié)構(gòu)更為穩(wěn)定,即:Master
這樣的結(jié)構(gòu)方便解決單點故障問題,實現(xiàn)Slave對Master的殲升液替換。如果Master掛了,可以立刻啟用Slave1做Master,其他不變。
4. MySQL里有2023w數(shù)據(jù),redis中只存20w的數(shù)據(jù),如何保證redis中的數(shù)據(jù)都是熱點數(shù)據(jù)
相關(guān)知識:redis 內(nèi)存數(shù)據(jù)集大小上升到一定大小的時候,就會施行數(shù)據(jù)淘汰策略。redis 提供 6種數(shù)據(jù)淘汰策略:
voltile-lru:從已設(shè)置過期時間的數(shù)據(jù)集(server.db.expires)中挑選最近最少使用的數(shù)據(jù)淘汰
volatile-ttl:從已設(shè)置過期時間的數(shù)據(jù)集(server.db.expires)中挑選將要笑搭過期的數(shù)據(jù)淘汰
volatile-random:從已設(shè)置過期時間的數(shù)據(jù)集(server.db.expires)中任意選擇數(shù)據(jù)淘汰
allkeys-lru:從數(shù)據(jù)集(server.db.dict)中挑選最近最少使用的數(shù)據(jù)淘汰
allkeys-random:從數(shù)據(jù)集(server.db.dict)中任意選擇數(shù)據(jù)淘汰
no-enviction(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)
相關(guān)推薦:《Python視頻教程》
5. Memcache與Redis的區(qū)別都有哪些?
1)、存儲方式
Memecache把數(shù)據(jù)全部存在內(nèi)存之中,斷電后會掛掉,數(shù)據(jù)不能超過內(nèi)存大小。
Redis有部份存在硬盤上,這樣能保證數(shù)據(jù)的持久性。
2)、數(shù)據(jù)支持類型
Memcache對數(shù)據(jù)類型支持相對簡單。
Redis有復(fù)雜的數(shù)據(jù)類型。
3),value大小
redis更大可以達(dá)到1GB,而memcache只有1MB
6. Redis 常見的性能問題都有哪些?如何解決?
1).Master寫內(nèi)存快照,save命令調(diào)度rdbSave函數(shù),會阻塞主線程的工作,當(dāng)快照比較大時對性能影響是非常大的,會間斷性暫停服務(wù),所以Master更好不要寫內(nèi)存快照。
2).Master AOF持久化,如果不重寫AOF文件,這個持久化方式對性能的影響是最小的,但是AOF文件會不斷增大,AOF文件過大會影響Master重啟的恢復(fù)速度。Master更好不要做任何持久化工作,包括內(nèi)存快照和AOF日志文件,特別是不要啟用內(nèi)存快照做持久化,如果數(shù)據(jù)比較關(guān)鍵,某個Slave開啟AOF備份數(shù)據(jù),策略為每秒同步一次。
3).Master調(diào)用BGREWRITEAOF重寫AOF文件,AOF在重寫的時候會占大量的CPU和內(nèi)存資源,導(dǎo)致服務(wù)load過高,出現(xiàn)短暫服務(wù)暫停現(xiàn)象。
4). Redis主從復(fù)制的性能問題,為了主從復(fù)制的速度和連接的穩(wěn)定性,Slave和Master更好在同一個局域網(wǎng)內(nèi)
7. redis 最適合的場景
Redis最適合所有數(shù)據(jù)in-momory的場景,雖然Redis也提供持久化功能,但實際更多的是一個disk-backed的功能,跟傳統(tǒng)意義上的持久化有比較大的差別,那么可能大家就會有疑問,似乎Redis更像一個加強(qiáng)版的Memcached,那么何時使用Memcached,何時使用Redis呢?
如果簡單地比較Redis與Memcached的區(qū)別,大多數(shù)都會得到以下觀點:
1.Redis不僅僅支持簡單的k/v類型的數(shù)據(jù),同時還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲。
2.Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
3.Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中,重啟的時候可以再次加載進(jìn)行使用。
(1)會話緩存(Session Cache)
最常用的一種使用Redis的情景是會話緩存(session cache)。用Redis緩存會話比其他存儲(如Memcached)的優(yōu)勢在于:Redis提供持久化。當(dāng)維護(hù)一個不是嚴(yán)格要求一致性的緩存時,如果用戶的購物車信息全部丟失,大部分人都會不高興的,現(xiàn)在,他們還會這樣嗎?
幸運的是,隨著 Redis 這些年的改進(jìn),很容易找到怎么恰當(dāng)?shù)氖褂肦edis來緩存會話的文檔。甚至廣為人知的商業(yè)平臺Magento也提供Redis的插件。
(2)全頁緩存(FPC)
除基本的會話token之外,Redis還提供很簡便的FPC平臺?;氐揭恢滦詥栴},即使重啟了Redis實例,因為有磁盤的持久化,用戶也不會看到頁面加載速度的下降,這是一個極大改進(jìn),類似PHP本地FPC。
再次以Magento為例,Magento提供一個插件來使用Redis作為全頁緩存后端。
此外,對WordPress的用戶來說,Pantheon有一個非常好的插件 wp-redis,這個插件能幫助你以最快速度加載你曾瀏覽過的頁面。
(3)隊列
Reids在內(nèi)存存儲引擎領(lǐng)域的一大優(yōu)點是提供 list 和 set 操作,這使得Redis能作為一個很好的消息隊列平臺來使用。Redis作為隊列使用的操作,就類似于本地程序語言(如Python)對 list 的 push/pop 操作。
如果你快速的在Google中搜索“Redis queues”,你馬上就能找到大量的開源項目,這些項目的目的就是利用Redis創(chuàng)建非常好的后端工具,以滿足各種隊列需求。例如,Celery有一個后臺就是使用Redis作為broker,你可以從這里去查看。
(4)排行榜/計數(shù)器
Redis在內(nèi)存中對數(shù)字進(jìn)行遞增或遞減的操作實現(xiàn)的非常好。(Set)和有序(Sorted Set)也使得我們在執(zhí)行這些操作的時候變的非常簡單,Redis只是正好提供了這兩種數(shù)據(jù)結(jié)構(gòu)。所以,我們要從排序中獲取到排名最靠前的10個用戶–我們稱之為“user_scores”,我們只需要像下面一樣執(zhí)行即可:
當(dāng)然,這是假定你是根據(jù)你用戶的分?jǐn)?shù)做遞增的排序。如果你想返回用戶及用戶的分?jǐn)?shù),你需要這樣執(zhí)行:
ZRANGE user_scores 0 10 WITHSCORES
Agora Games就是一個很好的例子,用Ruby實現(xiàn)的,它的排行榜就是使用Redis來存儲數(shù)據(jù)的,你可以在這里看到。
(5)發(fā)布/訂閱
前臺獲取redis數(shù)據(jù)庫的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于前臺獲取redis數(shù)據(jù)庫,利用Redis實現(xiàn)前臺數(shù)據(jù)獲?。?0字以內(nèi),如何獲取redis管理的session,三分鐘讀懂redis數(shù)據(jù)庫的信息別忘了在本站進(jìn)行查找喔。
成都服務(wù)器托管選創(chuàng)新互聯(lián),先上架開通再付費。
創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)-網(wǎng)站建設(shè),軟件開發(fā)老牌服務(wù)商!微信小程序開發(fā),APP開發(fā),網(wǎng)站制作,網(wǎng)站營銷推廣服務(wù)眾多企業(yè)。電話:028-86922220
分享文章:利用Redis實現(xiàn)前臺數(shù)據(jù)獲?。?0字以內(nèi) (前臺獲取redis數(shù)據(jù)庫)
文章出自:http://www.dlmjj.cn/article/djsschh.html


咨詢
建站咨詢
