JCS的学习与应用二:cache.ccf配置说明

    

        JCS比较关键的部分就是缓存配置文件,它支持自定义缓存区域(region),也就是多区域缓存,可以根据不同业务要求,来对不同缓存区域进行特殊设定。还有,默认提供了辅助缓存(索引式硬盘缓存和分布式缓存),在每个region的第一行可以设定该区域缓存的辅助信息,是否使用辅助缓存等。


      下面对cache.ccf配置中的一些配置做下介绍。
 
# 这里是设定使用辅助缓存项,也可以不填,使用默认值
jcs.default=

 
# 设定使用的 cache 属性管理类别(复合型缓存)
jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes

 
# 设定 cache 内对象的上限,这里指的是某区域内缓存对象的最大上限,
#一般设定为1000,只能存储#988,另外2个对象空间被占用
jcs.default.cacheattributes.MaxObjects=1000

 
# 设定 memory cache 的算法,LRU(近期最少使用算法)会将内存页中近期不常用的对象移除内存
#jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache

 
# 设定是否使用冗余内存清除程序
jcs.default.cacheattributes.UseMemoryShrinker=true

 
# 当有使用 memory shrinker 时,设定闲置内存的过期时间
#(就是超过这个时长时,根据缓存算法,超出MaxObjects(内对象的上限)的那部分对象将要被清除或者被存入磁盘中)
jcs.default.cacheattributes.MaxMemoryIdleTimeSeconds=3600

 
# 设定 shinker 执行时间间隔,会定期压缩缓存所占用内存
jcs.default.cacheattributes.ShrinkerIntervalSeconds=60

 
# 设定 element 属性类别
jcs.default.elementattributes=org.apache.jcs.engine.ElementAttributes

 
#UseMemoryShrinker 和 IsEternal 都是用来自动删除对象的。
#设定是否永久有效,默认为true
jcs.default.elementattributes.IsEternal=false

 
# 设定缓存element最大生命周期,超过时间后去请求缓存对象则返回null
jcs.default.elementattributes.MaxLifeSeconds=21600

 
# 设定缓存element可闲置的时间,需要配合设置IsEternal=false时才有效
jcs.default.elementattributes.IdleTime=1800


#下面三个配置是开启辅助缓存的,如果在第一行没有设置辅助缓存,这里则是无效的。
#在第一行配置后,这里如果是false也是无效的,还是会进行一些辅助缓存的初始化操作等等,
#只是不会真正的生成缓存数据。
# 开启磁盘缓存,默认为true
jcs.default.elementattributes.IsSpool=false


# 关闭远程缓存,默认为true
jcs.default.elementattributes.IsRemote=false



# 关闭横向式的并行缓存,默认为true
jcs.default.elementattributes.IsLateral=false
     
       在通过配置src/classes目录下的cache.ccf文件,则可以通过代码来get到某个region缓存区域,并进一步put缓存对象了。

JCS cache = JCS.getInstance(cacheName);
cache.put("key","value");


  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
以下是实现要求的代码,包含了创建线程、定义队列、读取yuv图片、编码为jpeg、发送完成通知等功能。为了方便测试,代码中使用了随机生成图片的方式代替读取yuv图片的过程。 ``` #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #include <string.h> #include <sys/time.h> #include <jpeglib.h> #define QUEUE_SIZE 5 #define YUV_WIDTH 640 #define YUV_HEIGHT 480 typedef struct { unsigned char *data; int size; } YuvData; typedef struct { YuvData queue[QUEUE_SIZE]; int front; int rear; int count; int is_full; pthread_mutex_t mutex; pthread_cond_t empty_cond; pthread_cond_t full_cond; } YuvQueue; void yuv_queue_init(YuvQueue *queue) { queue->front = 0; queue->rear = 0; queue->count = 0; queue->is_full = 0; pthread_mutex_init(&queue->mutex, NULL); pthread_cond_init(&queue->empty_cond, NULL); pthread_cond_init(&queue->full_cond, NULL); } void yuv_queue_push(YuvQueue *queue, YuvData *data) { pthread_mutex_lock(&queue->mutex); while (queue->is_full) { pthread_cond_wait(&queue->full_cond, &queue->mutex); } queue->queue[queue->rear] = *data; queue->rear = (queue->rear + 1) % QUEUE_SIZE; queue->count++; queue->is_full = (queue->count == QUEUE_SIZE); pthread_cond_signal(&queue->empty_cond); pthread_mutex_unlock(&queue->mutex); } int yuv_queue_pop(YuvQueue *queue, YuvData *data) { pthread_mutex_lock(&queue->mutex); while (queue->count == 0) { pthread_cond_wait(&queue->empty_cond, &queue->mutex); } *data = queue->queue[queue->front]; queue->front = (queue->front + 1) % QUEUE_SIZE; queue->count--; queue->is_full = 0; pthread_cond_signal(&queue->full_cond); pthread_mutex_unlock(&queue->mutex); return 0; } void encode_yuv_to_jpeg(YuvData *yuv, char *filename) { struct timeval tv; gettimeofday(&tv, NULL); char jpeg_filename[80]; sprintf(jpeg_filename, "%ld.%03ld.jpeg", tv.tv_sec, tv.tv_usec / 1000); FILE *outfile = fopen(jpeg_filename, "wb"); if (outfile == NULL) { fprintf(stderr, "Error opening output jpeg file %s\n", jpeg_filename); return; } struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); jpeg_stdio_dest(&cinfo, outfile); cinfo.image_width = YUV_WIDTH; cinfo.image_height = YUV_HEIGHT; cinfo.input_components = 3; cinfo.in_color_space = JCS_YCbCr; jpeg_set_defaults(&cinfo); jpeg_set_quality(&cinfo, 80, TRUE); jpeg_start_compress(&cinfo, TRUE); JSAMPROW row[1]; while (cinfo.next_scanline < cinfo.image_height) { row[0] = (JSAMPROW) (yuv->data + cinfo.next_scanline * YUV_WIDTH * 3); jpeg_write_scanlines(&cinfo, row, 1); } jpeg_finish_compress(&cinfo); fclose(outfile); jpeg_destroy_compress(&cinfo); } void *thread_a(void *arg) { YuvQueue *queue = (YuvQueue *) arg; for (int i = 0; i < 100; i++) { YuvData yuv; yuv.size = YUV_WIDTH * YUV_HEIGHT * 3; yuv.data = (unsigned char *) malloc(yuv.size); for (int j = 0; j < yuv.size; j++) { yuv.data[j] = rand() % 256; } yuv_queue_push(queue, &yuv); } printf("Thread A finished\n"); pthread_exit(NULL); } void *thread_b(void *arg) { YuvQueue *queue = (YuvQueue *) arg; while (1) { YuvData yuv; int ret = yuv_queue_pop(queue, &yuv); if (ret != 0) { break; } encode_yuv_to_jpeg(&yuv, NULL); free(yuv.data); } printf("Thread B finished\n"); pthread_exit(NULL); } int main() { YuvQueue queue; yuv_queue_init(&queue); pthread_t threadA, threadB; pthread_create(&threadA, NULL, thread_a, &queue); pthread_create(&threadB, NULL, thread_b, &queue); pthread_join(threadA, NULL); pthread_mutex_lock(&queue.mutex); while (queue.count > 0) { pthread_cond_wait(&queue.empty_cond, &queue.mutex); } pthread_cond_signal(&queue.empty_cond); pthread_mutex_unlock(&queue.mutex); pthread_join(threadB, NULL); return 0; } ``` 这里提供一个简单的Makefile,用于编译和链接程序: ``` CC = gcc CFLAGS = -g -Wall LIBS = -ljpeg -lpthread all: yuv_jpeg_encode yuv_jpeg_encode: main.o $(CC) $(CFLAGS) -o $@ $^ $(LIBS) main.o: main.c $(CC) $(CFLAGS) -c -o $@ $^ clean: rm -f *.o yuv_jpeg_encode ``` 在Linux环境下,可以使用以下命令来编译和运行程序: ``` make ./yuv_jpeg_encode ``` 程序运行后,会在当前目录下生成100个jpeg文件,每个文件的名称以毫秒级系统时间命名。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是一道光_

1分也是爱,鼓励鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值