数据存储与缓存1-redis-会话缓存-C

1.redis
学习redis的标准,要能在新环境中设计搭建redis缓存系统

2.memcached

3.MongoDB


1.redis
redis是内存数据库,有别于关系型数据库,redis是key-value键值对形式的数据库。操作redis命令就相对sql。相比于memcached,Redis是单线程运行。redis是c语言写的(什么时候能有个中国人,写个全世界级的开源软件)。

redis存的数据类型有5种:字符串、哈希、链表、集合、有序集合

操作数据命令
字符串(string):
set,get

哈希(hash):
hset,hget

链表(List):
lpush,lpop

集合(sets):
sadd,sremove

有序集合(sorted sets):
zadd,zrem



1.1 下载安装redis
下载
https://github.com/ServiceStack/redis-windows/blob/master/downloads/redis64-3.0.501.zip

解压后配置
redis.windows.conf文件
#配置redis内存大小
#maxmemory <bytes>
maxmemory 1024000000

#配置密码
# requirepass foobared 
requirepass 111111


#启动redis服务器
D:\service\redis64-3.0.501>redis-server.exe redis.windows.conf




1.2 redis使用-客户端
#启动redis客户端
D:\service\redis64-3.0.501>redis-cli.exe -p 6379
127.0.0.1:6379> set name byron
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 111111
OK
127.0.0.1:6379> set name byron
OK
127.0.0.1:6379> get name
"byron"
127.0.0.1:6379>




#安装windows服务
D:\service\redis64-3.0.501>redis-server --service-install redis.windows.conf --l
oglevel verbose
[3288] 09 Jun 22:48:00.926 # Granting read/write access to 'NT AUTHORITY\Network
Service' on: "D:\service\redis64-3.0.501" "D:\service\redis64-3.0.501\"
[3288] 09 Jun 22:48:00.927 # Redis successfully installed as a service.

D:\service\redis64-3.0.501>

下次重启电脑后,可直接执行客户端命令
redis-cli.exe


常用命令:
#查看服务器信息
>info

#查看服务器连接情况(返回pong说明连接正常)
>ping

#清空数据库
>flushdb

#keys值数量
>dbsize

#基本数据操作
>set name test
>get name   
>del name
>exists name
>type name
>keys *   // 查询满足特定格式的key
>rename name name1   //重名了key值

1.3 redis master-slave设计
将redis安装文件复制成多份(根据要设计的redisslave个数决定),修改配置文件redis.windows.conf
#slave1
port 6380
bind 127.0.0.1
requirepass 111180
slaveof 127.0.0.1 6379
masterauth 111111
slave-read-only yes


#slave2
port 6381
bind 127.0.0.1
requirepass 111181
slaveof 127.0.0.1 6379
masterauth 111111
slave-read-only yes


设置完后启动redis,可通过
>redis-cli.exe -p 6380
访问slave的redis

redis分布式集群需要ruby环境

redis分布式集群-java,设置新建2个独立的master实例,jedis中实现分布式


1.4 redis使用-java
redisjar包:
<dependency>
	    <groupId>redis.clients</groupId>
	    <artifactId>jedis</artifactId>
	    <version>2.9.0</version>
	</dependency>


java调用redis服务,主要有自连,事务,管道,分布式或者其中2者的组合。用户可根据不同场景使用不同方法
package com.byron.redis.client;

import java.util.Arrays;
import java.util.List;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPipeline;
import redis.clients.jedis.ShardedJedisPool;
import redis.clients.jedis.Transaction;

public class RedisClient {
	/**
	 * 普通调用
	 */
	public void test1Normal() {
		Jedis jedis = new Jedis("localhost"); 
		jedis.auth("111111");
	    long start = System.currentTimeMillis(); 
	    for (int i = 0; i < 100000; i++) { 
	        String result = jedis.set("n" + i, "n" + i); 
	    } 
	    long end = System.currentTimeMillis(); 
	    System.out.println("Simple SET: " + ((end - start)/1000.0) + " seconds"); 
	    jedis.disconnect(); 
	}
	
	/**
	 * 事务调用
	 */
	public void test2Trans() { 
	    Jedis jedis = new Jedis("localhost"); 
	    jedis.auth("111111");
	    long start = System.currentTimeMillis(); 
	    Transaction tx = jedis.multi(); 
	    for (int i = 0; i < 100000; i++) { 
	        tx.set("t" + i, "t" + i); 
	    } 
	    List<Object> results = tx.exec(); 
	    long end = System.currentTimeMillis(); 
	    System.out.println("Transaction SET: " + ((end - start)/1000.0) + " seconds"); 
	    jedis.disconnect(); 
	} 
	
	/**
	 * 管道调用
	 */
	public void test3Pipelined() { 
	    Jedis jedis = new Jedis("localhost"); 
	    jedis.auth("111111");
	    Pipeline pipeline = jedis.pipelined(); 
	    long start = System.currentTimeMillis(); 
	    for (int i = 0; i < 100000; i++) { 
	        pipeline.set("p" + i, "p" + i); 
	    } 
	    List<Object> results = pipeline.syncAndReturnAll(); 
	    long end = System.currentTimeMillis(); 
	    System.out.println("Pipelined SET: " + ((end - start)/1000.0) + " seconds"); 
	    jedis.disconnect(); 
	} 
	
	/**
	 * 管道事务调用
	 */
	public void test4combPipelineTrans() { 
	    Jedis jedis = new Jedis("localhost"); 
	    jedis.auth("111111");
	    long start = System.currentTimeMillis(); 
	    Pipeline pipeline = jedis.pipelined(); 
	    pipeline.multi(); 
	    for (int i = 0; i < 100000; i++) { 
	        pipeline.set("" + i, "" + i); 
	    } 
	    pipeline.exec(); 
	    List<Object> results = pipeline.syncAndReturnAll(); 
	    long end = System.currentTimeMillis(); 
	    System.out.println("Pipelined transaction: " + ((end - start)/1000.0) + " seconds"); 
	    jedis.disconnect(); 
	} 
	
	/**
	 * 分布式调用
	 */
	public void test5shardNormal() { 
		JedisShardInfo shard1 = new JedisShardInfo("localhost",6379);
		shard1.setPassword("111111");
		JedisShardInfo shard2 = new JedisShardInfo("localhost",6378);
		shard2.setPassword("111178");
	    List<JedisShardInfo> shards = Arrays.asList(shard1, 
	            shard2); 

	    ShardedJedis sharding = new ShardedJedis(shards); 

	    long start = System.currentTimeMillis(); 
	    for (int i = 0; i < 100000; i++) { 
	        String result = sharding.set("sn" + i, "n" + i); 
	    } 
	    long end = System.currentTimeMillis(); 
	    System.out.println("Simple@Sharing SET: " + ((end - start)/1000.0) + " seconds"); 

	    sharding.disconnect(); 
	} 
	
	/**
	 * 分布式管道调用
	 */
	public void test6shardpipelined() { 
		JedisShardInfo shard1 = new JedisShardInfo("localhost",6379);
		shard1.setPassword("111111");
		JedisShardInfo shard2 = new JedisShardInfo("localhost",6378);
		shard2.setPassword("111178");
	    List<JedisShardInfo> shards = Arrays.asList(shard1, 
	            shard2);  

	    ShardedJedis sharding = new ShardedJedis(shards); 

	    ShardedJedisPipeline pipeline = sharding.pipelined(); 
	    long start = System.currentTimeMillis(); 
	    for (int i = 0; i < 100000; i++) { 
	        pipeline.set("sp" + i, "p" + i); 
	    } 
	    List<Object> results = pipeline.syncAndReturnAll(); 
	    long end = System.currentTimeMillis(); 
	    System.out.println("Pipelined@Sharing SET: " + ((end - start)/1000.0) + " seconds"); 

	    sharding.disconnect(); 
	} 
	
	public void test7shardSimplePool() { 
		JedisShardInfo shard1 = new JedisShardInfo("localhost",6379);
		shard1.setPassword("111111");
		JedisShardInfo shard2 = new JedisShardInfo("localhost",6378);
		shard2.setPassword("111178");
	    List<JedisShardInfo> shards = Arrays.asList(shard1, 
	            shard2);   

	    ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shards); 

	    ShardedJedis one = pool.getResource(); 

	    long start = System.currentTimeMillis(); 
	    for (int i = 0; i < 100000; i++) { 
	        String result = one.set("spn" + i, "n" + i); 
	    } 
	    long end = System.currentTimeMillis(); 
	    pool.returnResource(one); 
	    System.out.println("Simple@Pool SET: " + ((end - start)/1000.0) + " seconds"); 

	    pool.destroy(); 
	} 
	
	/**
	 * 分布式连接池异步调用
	 */
	public void test8shardPipelinedPool() { 
		JedisShardInfo shard1 = new JedisShardInfo("localhost",6379);
		shard1.setPassword("111111");
		JedisShardInfo shard2 = new JedisShardInfo("localhost",6378);
		shard2.setPassword("111178");
	    List<JedisShardInfo> shards = Arrays.asList(shard1, 
	            shard2);    

	    ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shards); 

	    ShardedJedis one = pool.getResource(); 

	    ShardedJedisPipeline pipeline = one.pipelined(); 

	    long start = System.currentTimeMillis(); 
	    for (int i = 0; i < 100000; i++) { 
	        pipeline.set("sppn" + i, "n" + i); 
	    } 
	    List<Object> results = pipeline.syncAndReturnAll(); 
	    long end = System.currentTimeMillis(); 
	    pool.returnResource(one); 
	    System.out.println("Pipelined@Pool SET: " + ((end - start)/1000.0) + " seconds"); 
	    pool.destroy(); 
	} 
	
	public static void main(String[] args) {
		RedisClient client = new RedisClient();
		// client.test1Normal(); // Simple SET: 9.562 seconds
		// client.test2Trans(); // Transaction SET: 0.757 seconds
		// client.test3Pipelined(); // Pipelined SET: 0.687 seconds
		// client.test4combPipelineTrans(); // Pipelined transaction: 0.787 seconds
		// client.test5shardNormal(); // Simple@Sharing SET: 10.988 seconds
		// client.test6shardpipelined(); // Pipelined@Sharing SET: 0.964 seconds
		// client.test7shardSimplePool(); // Simple@Pool SET: 11.567 seconds
		// client.test8shardPipelinedPool(); // Pipelined@Pool SET: 0.985 seconds
	}
	
}


由上面测试可知,第一种自连与第二种事务,很明显事务快很多,那是不是多用事务。其实不然,如果只是插入一条数据,自连就明显比事务快。


1.5 redis使用-spring


1.6 redis使用-企业级设计




参考网站:
https://redis.io/

win7x64下的redis安装与使用
http://www.cnblogs.com/koal/p/5484916.html

redis常用命令
http://blog.csdn.net/tangsilai/article/details/7477961

Redis使用详细教程
http://www.cnblogs.com/wangyuyu/p/3786236.html

猜你喜欢

转载自newjava-sina-cn.iteye.com/blog/2378650