Archive for September, 2009

macOS 命令行下执行sudo 不输入密码的方式

1. 打开sudo配置文件
命令行下执行:
visudo
2. 将配置文件中
%wheel ALL=(ALL) NOPASSWD: ALL
的注释去掉
3. 将本机用户加入到wheel组
命令行下执行:
dscl . -append /Groups/wheel GroupMembership zhangwenjin
4. 注销后配置就生效了。

memcached 实现合并数据库更新的方法

方案1 memcached 中数据被替换时候,将被替换数据抛出,并同步到数据库
memcached1.4.1 修改方法:
items.c 文件
#include <arpa/inet.h>
static pthread_mutex_t notify_lock = PTHREAD_MUTEX_INITIALIZER;
static void notify_out_of_memory(char *msg)
{
   static int sockfd = -1;
   static struct sockaddr_in servaddr;
   static socklen_t len;
   static int fflags;
   /*if (strlen(msg) > 1024)
   return;*/
   pthread_mutex_lock(&notify_lock);
   do {
   if (sockfd == -1) {
   if (settings.verbose > 1) {
   fprintf(stderr, “— debug create notify socket\n”);
   }
   if ((sockfd [...]

memcache 丢数据解决方案

最近开发游戏希望使用memcache 实现数据的延迟写入。比如一小时以内数据变化都存放到memcached中,无论数据读取或者写入只与memcached交互。但实际情况是,memcached的LRU淘汰算法,把内存分为很多slab, 当某个slab空间已经被使用完了,即使其他slab里面还有空间,仍然存在数据被踢的可能。一小时内,memcached内存占用不到50%,已经能检测到数据丢失。
为了保证数据的完整, memcached 在启动时候应该开启 -M 参数。该参数含义是 return error on memory exhausted (rather than removing items)。看memcached源代码可以知道,开启该参数后,当某个slab写满,新数据将无法写入。保护了原数据不丢失。程序这边如果检测到新数据,就触发把数据回写人数据库的操作,并主动释放一部分内存。
memcached 另外一个问题是,设置了永不过期的数据也会被踢掉,这个问题就得修改memcached 源代码了。
文件 items.c,找到一下代码
for (search = tails[id]; tries > 0 && search != NULL; tries–, search=search->prev) {
if (search->refcount == 0) {
   if (search->exptime == 0 || search->exptime > current_time) {
   itemstats[id].evicted++;
   itemstats[id].evicted_time = current_time – search->time;
   STATS_LOCK();
   stats.evictions++;
   STATS_UNLOCK();
   }
   [...]