亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++開發在IOS環境下運行的LRUCache緩存功能

2020-02-24 14:28:23
字體:
來源:轉載
供稿:網友

lrucache是常用的緩存替換算法,其原理是根據使用率消除數據,它通常被實現為一個隊列,如果緩存命中,它會將數據移動到隊列的頭部,下文是武林技術頻道小編為大家介紹的C++開發在IOS環境下運行的LRUCache緩存功能,一起來了解一下吧!
另外還有人將MRU與LRU組合在一起使用,當然如果清楚了設計原理,那么就很容易理解了。
考慮到緩存實現多數使用單例模式,這里使用C++的模版方式設計了一個Singlton基類,這樣以后只要繼承該類,子類就會支持單例模式了。其代碼如下:

?

//
// SingltonT.h
//
#ifndef SingltonT_h
#define SingltonT_h
#include <iostream>
#include <tr1/memory>
using namespace std;
using namespace std::tr1;
template <typename T>
class Singlton {
public:
static T* instance();
void print() {
cout << "haha" << endl;
}
~Singlton() {
cout << "destruct singlton" << endl;
}
protected:
Singlton();
//private:
protected:
static std::tr1::shared_ptr<T> s_instance;
//Singlton();
};
template <typename T>
std::tr1::shared_ptr<T> Singlton<T>::s_instance;
template <typename T>
Singlton<T>::Singlton() {
cout << "construct singlton" << endl;
}
template <typename T>
T* Singlton<T>::instance() {
if (!s_instance.get())
s_instance.reset(new T);
return s_instance.get();
}


另外考慮到在多線程下對static單例對象進行操作,會出現并發訪問同步的問題,所以這里使用了讀寫互斥鎖來進行set(設置數據)的同步。如下:

?

?

?


#ifndef _RWLOCK_H_
#define _RWLOCK_H_
#define LOCK(q) while (__sync_lock_test_and_set(&(q)->lock,1)) {}
#define UNLOCK(q) __sync_lock_release(&(q)->lock);
struct rwlock {
int write;
int read;
};
static inline void
rwlock_init(struct rwlock *lock) {
lock->write = 0;
lock->read = 0;
}
static inline void
rwlock_rlock(struct rwlock *lock) {
for (;;) {//不斷循環,直到對讀計數器累加成功
while(lock->write) {
__sync_synchronize();
}
__sync_add_and_fetch(&lock->read,1);
if (lock->write) {//當已是寫鎖時,則去掉讀鎖記數器
__sync_sub_and_fetch(&lock->read,1);
} else {
break;
}
}
}
static inline void
rwlock_wlock(struct rwlock *lock) {
__sync_lock_test_and_set(&lock->write,1);
while(lock->read) {
//http://blog.itmem.com/?m=201204
//http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/Atomic-Builtins.html
__sync_synchronize();//很重要,如果去掉,g++ -O3 優化編譯后的生成的程序會產生死鎖
}
}
static inline void
rwlock_wunlock(struct rwlock *lock) {
__sync_lock_release(&lock->write);
}
static inline void
rwlock_runlock(struct rwlock *lock) {
__sync_sub_and_fetch(&lock->read,1);
}


這里并未使用pthread_mutex_t來設計鎖,而是使用了__sync_fetch_and_add指令體系,當然最終是否如上面鏈接中作者所說的比pthread_mutex_t性能要高7-8倍,我沒測試過,感興趣的朋友也可以幫助測試一下。
有了這兩個類之后,我又補充了原文作者中所提到了KEY比較方法的定義,同時引入了id來支持object-c的對象緩存,最終代碼修改如下:

?

?

?


#ifndef _MAP_LRU_CACHE_H_
#define _MAP_LRU_CACHE_H_
#include <string.h>
#include <iostream>
#include "rwlock.h"
#include <stdio.h>
#include <sys/malloc.h>
using namespace std;
namespace lru_cache {
static const int DEF_CAPACITY = 100000;//默認緩存記錄數
typedef unsigned long long virtual_time;
typedef struct _HashKey
{
NSString* key;
}HashKey;
typedef struct _HashValue
{
id value_;
virtual_time access_;
}HashValue;
//僅針對HashKey比較器
template <class key_t>
struct hashkey_compare{
bool operator()(key_t x, key_t y) const{
return x < y;
}
};
template <>
struct hashkey_compare<HashKey>
{
bool operator()(HashKey __x, HashKey __y) const{
string x = [__x.key UTF8String];
string y = [__y.key UTF8String];
return x < y;
}
};
//自定義map類型
template <typename K, typename V, typename _Compare = hashkey_compare<K>,
typename _Alloc = std::allocator<std::pair<const K, V> > >
class lru_map: public map<K, V, _Compare, _Alloc>{};
class CLRUCache
{
public:
CLRUCache() : _now(0){
_lru_list = shared_ptr<lru_map<virtual_time, HashKey> >(new lru_map<virtual_time, HashKey>);
_hash_table = shared_ptr<lru_map<HashKey, HashValue> > (new lru_map<HashKey, HashValue>);
}
~CLRUCache(){
_lru_list->clear();
_hash_table->clear();
}
int set( const HashKey& key, const id &value )
{
HashValue hash_value;
hash_value.value_ = value;
hash_value.access_ = get_virtual_time();
pair< map<HashKey, HashValue>::iterator, bool > ret = _hash_table->insert(make_pair(key, hash_value));
if ( !ret.second ){
// key already exist
virtual_time old_access = (*_hash_table)[key].access_;
map<virtual_time, HashKey>::iterator iter = _lru_list->find(old_access);
if(iter != _lru_list->end())
{
_lru_list->erase(iter);
}
_lru_list->insert(make_pair(hash_value.access_, key));
(*_hash_table)[key] = hash_value;
}
else {
_lru_list->insert(make_pair(hash_value.access_, key));
if ( _hash_table->size() > DEF_CAPACITY )
{
// get the least recently used key
map<virtual_time, HashKey>::iterator iter = _lru_list->begin();
_hash_table->erase( iter->second );
// remove last key from list
_lru_list->erase(iter);
}
}
return 0;
}
HashValue* get( const HashKey& key )
{
map<HashKey, HashValue>::iterator iter = _hash_table->find(key);
if ( iter != _hash_table->end() )
{
virtual_time old_access = iter->second.access_;
iter->second.access_ = get_virtual_time();
//調整當前key在LRU列表中的位置
map<virtual_time, HashKey>::iterator it = _lru_list->find(old_access);
if(it != _lru_list->end()) {
_lru_list->erase(it);
}
_lru_list->insert(make_pair(iter->second.access_, key));
return &(iter->second);
}
else{
return NULL;
}
}

unsigned get_lru_list_size(){ return (unsigned)_lru_list->size(); }
unsigned get_hash_table_size() { return (unsigned)_hash_table->size(); }
virtual_time get_now() { return _now; }
private:
virtual_time get_virtual_time()
{
return ++_now;
}
shared_ptr<lru_map<virtual_time, HashKey> > _lru_list;
shared_ptr<lru_map<HashKey, HashValue> > _hash_table;
virtual_time _now;
};
#endif


接下來看一下如果結合單例和rwlock來設計最終的緩存功能,如下:

?

?

?


using namespace lru_cache;
class DZCache: public Singlton<DZCache>
{
friend class Singlton<DZCache>;
private:
shared_ptr<CLRUCache> clu_cache;
rwlock *lock;
DZCache(){
lock =(rwlock*) malloc(sizeof(rwlock));
rwlock_init(lock);
clu_cache = shared_ptr<CLRUCache>(new CLRUCache());
cout << "construct JobList" << endl;
}
DZCache * Instance() {
return s_instance.get();
}
public:
~DZCache(){
free(lock);
}
static DZCache& getInstance(){
return *instance();
}
void set(NSString* key, id value){
//加鎖
rwlock_wlock(lock);
HashKey hash_key;
hash_key.key = key;
clu_cache->set(hash_key, value);
rwlock_wunlock(lock);
}
id get(NSString* key){
HashKey hash_key;
hash_key.key = key;
HashValue* value = clu_cache->get(hash_key);
if(value == NULL){
return nil;
}
else{
return value->value_;
}
}
};
#endif


最后看一下如何使用:

?

?

?


void testLRUCache(){
//指針方式
DZCache::instance()->set(@"name", @"daizhj");//設置
NSString* name = (NSString*)DZCache::instance()->get(@"name");//獲取
std::cout<<[name UTF8String]<<endl;
NSNumber * age=[NSNumber numberWithInt:123123];
DZCache::instance()->set(@"age", age);
age = (NSNumber*)DZCache::instance()->get(@"age");
//對象方式
DZCache::getInstance().set(@"name", @"daizhenjun");
name = (NSString*)DZCache::getInstance().get(@"name");
std::cout<<[name UTF8String]<<endl;
age = [NSNumber numberWithInt:123456];
DZCache::getInstance().set(@"age", age);
age = (NSNumber*)DZCache::getInstance().get(@"age");
}

上述文章就是我們為大家介紹的C++開發在IOS環境下運行的LRUCache緩存功能,看完對大家有所幫助么?希望大家繼續支持武林技術頻道!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av影视在线| 色偷偷噜噜噜亚洲男人| 粗暴蹂躏中文一区二区三区| 久久伊人91精品综合网站| 亚洲激情电影中文字幕| 国产精品久久久久久五月尺| 777国产偷窥盗摄精品视频| 欧美成人黑人xx视频免费观看| 91福利视频网| 夜夜嗨av一区二区三区免费区| 国产精品久久久久久久久| 91精品久久久久久久久久久久久久| 国产精品视频区1| 国产日韩欧美在线观看| 91成人在线播放| 久久人91精品久久久久久不卡| 51久久精品夜色国产麻豆| 国产97在线|亚洲| 久久久最新网址| 欧美特黄级在线| 揄拍成人国产精品视频| 少妇高潮 亚洲精品| 亚洲区在线播放| 欧美精品久久久久a| 57pao国产精品一区| 一个人www欧美| 久久亚洲一区二区三区四区五区高| 国产精品视频久久久| 欧美一区二区影院| 伊人久久久久久久久久久| 日本成人激情视频| 日本精品一区二区三区在线播放视频| 97久久久久久| 国产欧美日韩中文| 欧美成人小视频| 国产精欧美一区二区三区| 亚洲护士老师的毛茸茸最新章节| 国产一区二区日韩精品欧美精品| 美女av一区二区三区| 色婷婷久久av| 中文字幕日韩在线视频| 亚洲欧美国产精品va在线观看| 久久亚洲影音av资源网| 国产精品久久国产精品99gif| 亚洲人a成www在线影院| 日韩一二三在线视频播| 欧美精品在线看| 精品国产一区二区三区四区在线观看| 免费av一区二区| 日韩中文字幕精品| 亚洲女人被黑人巨大进入al| 精品国产精品自拍| 成人观看高清在线观看免费| 欧美床上激情在线观看| 欧美在线一区二区三区四| 日韩精品丝袜在线| 久久在精品线影院精品国产| 成人97在线观看视频| 国产中文日韩欧美| 欧美三级免费观看| 国产精品男人的天堂| 777精品视频| 国产欧美欧洲在线观看| 国产精品扒开腿做爽爽爽的视频| 欧美日韩中文字幕综合视频| 国产精品69久久| 亚洲伊人久久综合| 国产91精品久久久久久| www日韩中文字幕在线看| 在线成人激情视频| 伊人亚洲福利一区二区三区| 日韩免费在线观看视频| 日韩精品在线免费| 亚洲美腿欧美激情另类| 精品福利樱桃av导航| 久久精品欧美视频| 亚洲精品不卡在线| 免费成人高清视频| 国产91在线视频| 欧洲精品毛片网站| 中文字幕欧美国内| 日韩h在线观看| 精品欧美激情精品一区| www.欧美视频| 日本精品在线视频| 秋霞午夜一区二区| 日韩在线欧美在线国产在线| 国产成人拍精品视频午夜网站| 伊人伊成久久人综合网小说| 国产精品一香蕉国产线看观看| 亚洲视屏在线播放| 欧美日本亚洲视频| 欧美久久久精品| 亚洲高清一二三区| 国产精品久久久久久久av大片| 亚洲乱码国产乱码精品精| 欧美大尺度电影在线观看| 久久成人一区二区| 国产精品天天狠天天看| 欧美精品久久久久| 亚洲电影在线观看| 国产精品久久久久久久久免费| 欧美大全免费观看电视剧大泉洋| 亚洲黄色片网站| 欧美麻豆久久久久久中文| 国产一区二区三区欧美| 最近2019中文字幕大全第二页| 欧美专区第一页| 日本精品一区二区三区在线播放视频| 日本精品中文字幕| 欧美精品免费播放| 91久久精品日日躁夜夜躁国产| 国产97在线|亚洲| 欧美日韩亚洲视频一区| 国产精品久久999| 91探花福利精品国产自产在线| 欧美日韩福利在线观看| 欧美区二区三区| 欧美大胆在线视频| 欧美专区第一页| 久久久国产一区| 欧美日韩999| 亚洲综合日韩中文字幕v在线| 91av视频在线播放| 国产精品自产拍高潮在线观看| 久青草国产97香蕉在线视频| 欧美精品videos性欧美| 91免费看国产| 91久久国产精品91久久性色| 精品亚洲一区二区三区四区五区| 亚洲18私人小影院| 91精品国产91久久久久久| 国产精品专区第二| 欧美超级免费视 在线| 亚洲午夜国产成人av电影男同| 国产一区二区在线播放| 国产精品wwwwww| 久热在线中文字幕色999舞| 亚洲黄色片网站| 成人性生交大片免费看小说| 91超碰caoporn97人人| www.日韩.com| 日韩av色综合| 久久久97精品| 日韩视频―中文字幕| xxxxx91麻豆| 欧美日韩中文字幕| 国产精品久久久久久亚洲影视| 国产精品成人观看视频国产奇米| 伊人久久免费视频| 久久久久99精品久久久久| 亚洲在线一区二区| 亚洲国产小视频在线观看| 国产一区玩具在线观看| 日韩精品在线免费观看| 欧美极品美女视频网站在线观看免费| 中文字幕一区二区三区电影| 日韩电影免费观看在线| 国产精品色婷婷视频| 8090理伦午夜在线电影| 国产成人精品视频在线| 精品久久久久久中文字幕| 久久91精品国产91久久久| 亚洲毛片在线看|