JavaMail创建和发送邮件

来源:互联网 发布:现货黄金模拟软件 编辑:程序博客网 时间:2024/05/16 06:58

Redis学习笔记

一、Redis简介

Redis 是一个高性能的key-value数据库。

1.1Redis特点
  • Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

  • Redis支持数据的备份,即master-slave模式的数据备份。

1.2Redis优势
  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

二、Redis安装

2.1Windows安装

下载地址:https://github.com/dmajkic/redis/downloads

1.打开一个cmd窗口 使用cd命令切换目录到 C:\redis 运行

redis-server.exe redis.conf

2.另启一个cmd窗口,原来的不要关闭,不然就无法访问服务端了。切换到redis目录下运行

redis-cli.exe -h 127.0.0.1 -p 6379

3.设置键值对

set myKey abc

4.取出键值对

get myKey

2.2Linux安装

下载地址:http://www.redis.net.cn/download/

1.下载并安装

$ wget http://download.redis.io/releases/redis-2.8.17.tar.gz$ tar xzf redis-2.8.17.tar.gz$ cd redis-2.8.17$ make

make完后 redis-2.8.17目录下会出现redis服务程序redis-server,还有用于测试的客户端程序redis-cli

2.启动redis服务器

$ ./redis-server redis.conf

3.启动Redis客户端,与服务器交互

$ ./redis-cliredis> set foo barOKredis> get foo"bar"

三、Redis数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)

3.1 String(字符串)
  • string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。

  • string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。

  • string类型是Redis最基本的数据类型,一个键最大能存储512MB。

redis 127.0.0.1:6379> SET name "redis.net.cn"OKredis 127.0.0.1:6379> GET name"redis.net.cn"
3.2 Hash(哈希)
  • Redis hash 是一个键值对集合。

  • Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

  • 每个 hash 可以存储 232 - 1 键值对(40多亿)。

redis 127.0.0.1:6379> HMSET user:1 username redis.net.cn password redis.net.cn points 200OKredis 127.0.0.1:6379> HGETALL user:11) "username"2) "redis.net.cn"3) "password"4) "redis.net.cn"5) "points"6) "200"redis 127.0.0.1:6379>
3.3 List(列表)
  • Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。
  • 列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
redis 127.0.0.1:6379> lpush redis.net.cn redis(integer) 1redis 127.0.0.1:6379> lpush redis.net.cn mongodb(integer) 2redis 127.0.0.1:6379> lpush redis.net.cn rabitmq(integer) 3redis 127.0.0.1:6379> lrange redis.net.cn 0 101) "rabitmq"2) "mongodb"3) "redis"redis 127.0.0.1:6379>
3.4 Set(集合)
  • Redis的Set是string类型的无序集合。

  • 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

  • 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

  • 集合内元素的唯一性,第二次插入相同的元素将被忽略。

redis 127.0.0.1:6379> sadd redis.net.cn redis(integer) 1redis 127.0.0.1:6379> sadd redis.net.cn mongodb(integer) 1redis 127.0.0.1:6379> sadd redis.net.cn rabitmq(integer) 1redis 127.0.0.1:6379> sadd redis.net.cn rabitmq(integer) 0redis 127.0.0.1:6379> smembers redis.net.cn1) "rabitmq"2) "mongodb"3) "redis"

注意:添加一个string元素到,key对应的set集合中,成功返回1,如果元素以及在集合中返回0,key对应的set不存在返回错误。以上实例中 rabitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。

3.5 zset(sorted set:有序集合)
  • zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

  • 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

  • zset的成员是唯一的,但分数(score)却可以重复。

zadd 命令

添加元素到集合,元素在集合中存在则更新对应score

zadd key score member

redis 127.0.0.1:6379> zadd redis.net.cn 0 redis(integer) 1redis 127.0.0.1:6379> zadd redis.net.cn 0 mongodb(integer) 1redis 127.0.0.1:6379> zadd redis.net.cn 0 rabitmq(integer) 1redis 127.0.0.1:6379> zadd redis.net.cn 0 rabitmq(integer) 0redis 127.0.0.1:6379> ZRANGEBYSCORE redis.net.cn 0 10001) "redis"2) "mongodb"3) "rabitmq"

四、Java 使用 Redis(单机)

添加Maven依赖

<dependency>    <groupId>redis.clients</groupId>    <artifactId>jedis</artifactId>    <version>${jedis.version}</version></dependency>
4.1 连接到 Redis 服务
//连接Redis服务器jedis = new Jedis(HOST, PORT);//权限认证jedis.auth(PASSWORD);//查看服务是否运行System.out.println("Server is running: "+jedis.ping());
4.2 Redis Java String 实例
//增加数据jedis.set("user_name", "Mike");//查询数据System.out.println("query: " + jedis.get("user_name"));//修改数据jedis.append("user_name", " Jordan");System.out.println("update: " + jedis.get("user_name"));//删除数据jedis.del("user_name");System.out.println("delete: " + jedis.get("user_name"));//设置多键值对jedis.mset("user_name", "John", "user_password", "123456", "age", "20");System.out.println(jedis.get("user_name") + " " + jedis.get("user_password") + " " + jedis.get("age"));
4.3 Redis Java List 实例
//存放数据jedis.lpush("javaFramework", "spring");jedis.lpush("javaFramework", "springMVC");jedis.lpush("javaFramework", "mybatis");//获取长度,-1表示取得所有System.out.println("长度: " + jedis.llen("javaFramework"));//取出所有数据,jedis.lrange是按范围取出//第一个是key,第二个是起始位置,第三个是结束位置System.out.println("javaFramework: " + jedis.lrange("javaFramework", 0, -1));//删除数据jedis.del("javaFramework");System.out.println("删除后长度 : " + jedis.llen("javaFramework"));System.out.println(jedis.lrange("javaFramework", 0, -1));//存放数据jedis.lpush("javaFramework", "spring");jedis.lpush("javaFramework", "springMVC");jedis.lpush("javaFramework", "mybatis");//获取长度,-1表示取得所有System.out.println("长度: " + jedis.llen("javaFramework"));//取出所有数据,jedis.lrange是按范围取出//第一个是key,第二个是起始位置,第三个是结束位置System.out.println("javaFramework: " + jedis.lrange("javaFramework", 0, -1));//删除数据jedis.del("javaFramework");System.out.println("删除后长度 : " + jedis.llen("javaFramework"));System.out.println(jedis.lrange("javaFramework", 0, -1));
4.4 Redis Java Map 实例
Map<String, String> map = new HashMap<String, String>();map.put("name", "Mike");map.put("password", "123456");map.put("age", "20");//增加数据jedis.hmset("user", map);//查询数据//第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key是可变参数List<String> list = jedis.hmget("user", "name", "password", "age");System.out.println(list);//删除map中的某个键值jedis.hdel("user", "age");System.out.println("age: " + jedis.hmget("user", "age"));System.out.println("user的键中存放的值的个数: " + jedis.hlen("user"));System.out.println("是否存在key为user的记录: " + jedis.exists("user"));System.out.println("user对象中的所有key: " + jedis.hkeys("user"));System.out.println("user对象中的所有value: " + jedis.hvals("user"));//遍历数据for (String key : jedis.hkeys("user")) {    System.out.println(key + ": " + jedis.hmget("user", key));}//删除数据jedis.del("user");System.out.println("删除后是否存在key为user的记录: " + jedis.exists("user"));
4.5 Redis Java Set 实例
//添加jedis.sadd("user", "Mike");jedis.sadd("user", "chx");jedis.sadd("user", "are");//移除user集合中的元素arejedis.srem("user", "are");//获取所有加入user的valueSystem.out.println("user中的value: " + jedis.smembers("user"));//判断chx是否是user集合中的元素System.out.println("chx是否是user中的元素: " + jedis.sismember("user", "chx"));//返回集合中的一个随机元素System.out.println("集合中的一个随机元素: " + jedis.srandmember("user"));System.out.println("user中元素的个数: " + jedis.scard("user"));//添加jedis.sadd("user", "Mike");jedis.sadd("user", "chx");jedis.sadd("user", "are");//移除user集合中的元素arejedis.srem("user", "are");//获取所有加入user的valueSystem.out.println("user中的value: " + jedis.smembers("user"));//判断chx是否是user集合中的元素System.out.println("chx是否是user中的元素: " + jedis.sismember("user", "chx"));//返回集合中的一个随机元素System.out.println("集合中的一个随机元素: " + jedis.srandmember("user"));System.out.println("user中元素的个数: " + jedis.scard("user"));
4.6 排序实例
//将一个或多个值插入到列表的尾部(最右边)jedis.rpush("number", "4");jedis.rpush("number", "5");jedis.rpush("number", "3");//将一个或多个值插入到列表头部jedis.lpush("number", "9");jedis.lpush("number", "1");jedis.lpush("number", "2");System.out.println(jedis.lrange("number", 0, jedis.llen("number")-1));System.out.println("排序: " + jedis.sort("number"));//不改变原来的排序System.out.println(jedis.lrange("number", 0, -1));//将一个或多个值插入到列表的尾部(最右边)jedis.rpush("number", "4");jedis.rpush("number", "5");jedis.rpush("number", "3");//将一个或多个值插入到列表头部jedis.lpush("number", "9");jedis.lpush("number", "1");jedis.lpush("number", "2");System.out.println(jedis.lrange("number", 0, jedis.llen("number")-1));System.out.println("排序: " + jedis.sort("number"));//不改变原来的排序System.out.println(jedis.lrange("number", 0, -1));

四、Java 使用 Redis(集群)

public void SaveRedisCluster() {Set<HostAndPort> nodes = new HashSet<HostAndPort>();nodes.add(new HostAndPort("192.168.31.245", 7000));nodes.add(new HostAndPort("192.168.31.245", 7001));nodes.add(new HostAndPort("192.168.31.245", 7002));nodes.add(new HostAndPort("192.168.31.210", 7003));nodes.add(new HostAndPort("192.168.31.210", 7004));nodes.add(new HostAndPort("192.168.31.210", 7005));JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(1000);config.setMaxIdle(100);config.setTestOnBorrow(true);JedisCluster jedisCluster = new JedisCluster(nodes, config);jedisCluster.set("cluster", "this is a redis cluster");String result = jedisCluster.get("cluster");System.out.println(result);}

五、Redis连接池

连接池属性

//可用连接实例的最大数目,默认为8;//如果赋值为-1,则表示不限制,如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)private static Integer MAX_TOTAL = 1024;//控制一个pool最多有多少个状态为idle(空闲)的jedis实例,默认值是8private static Integer MAX_IDLE = 200;//等待可用连接的最大时间,单位是毫秒,默认值为-1,表示永不超时。//如果超过等待时间,则直接抛出JedisConnectionExceptionprivate static Integer MAX_WAIT_MILLIS = 10000;private static Integer TIMEOUT = 10000;//在borrow(用)一个jedis实例时,是否提前进行validate(验证)操作;//如果为true,则得到的jedis实例均是可用的private static Boolean TEST_ON_BORROW = true;//可用连接实例的最大数目,默认为8;//如果赋值为-1,则表示不限制,如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)private static Integer MAX_TOTAL = 1024;//控制一个pool最多有多少个状态为idle(空闲)的jedis实例,默认值是8private static Integer MAX_IDLE = 200;//等待可用连接的最大时间,单位是毫秒,默认值为-1,表示永不超时。//如果超过等待时间,则直接抛出JedisConnectionExceptionprivate static Integer MAX_WAIT_MILLIS = 10000;private static Integer TIMEOUT = 10000;//在borrow(用)一个jedis实例时,是否提前进行validate(验证)操作;//如果为true,则得到的jedis实例均是可用的private static Boolean TEST_ON_BORROW = true;

实例

JedisPoolConfig config = new JedisPoolConfig();/*  注意:    在高版本的jedis jar包,比如本版本2.9.0,JedisPoolConfig没有setMaxActive和setMaxWait属性了    这是因为高版本中官方废弃了此方法,用以下两个属性替换。    maxActive  ==>  maxTotal    maxWait==>  maxWaitMillis*/config.setMaxTotal(MAX_TOTAL);config.setMaxIdle(MAX_IDLE);config.setMaxWaitMillis(MAX_WAIT_MILLIS);config.setTestOnBorrow(TEST_ON_BORROW);jedisPool = new JedisPool(config, HOST, PORT, TIMEOUT, AUTH);

从连接池获取Jedis实例

Jedis jedis = jedisPool.getResource();

六、Spring整合Redis(单机)

6.1 添加Maven依赖
<dependency>    <groupId>redis.clients</groupId>    <artifactId>jedis</artifactId>    <version>${jedis.version}</version></dependency><dependency>    <groupId>org.springframework.data</groupId>    <artifactId>spring-data-commons</artifactId>    <version>2.0.0.M1</version></dependency><dependency>    <groupId>org.springframework.data</groupId>    <artifactId>spring-data-redis</artifactId>    <version>2.0.0.M1</version></dependency>
6.2 Redis服务器配置redis.properties
redis.host=127.0.0.1redis.port=6379redis.password=199498xyredis.maxTotal=1000#最大闲置连接数redis.maxIdle=100redis.minIdle=10redis.maxActive=300redis.maxWait=3000redis.testOnBorrow=trueredis.testOnReturn=trueredis.testWhileIdle=trueredis.timeout=3000
6.3 Spring整合Redis配置文件spring-redis.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://www.springframework.org/schema/beans       http://www.springframework.org/schema/beans/spring-beans.xsd">    <!-- redis连接池配置 -->    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">        <property name="maxTotal" value="${redis.maxTotal}"/>        <property name="maxIdle" value="${redis.maxIdle}"/>        <property name="minIdle" value="${redis.minIdle}"/>        <property name="maxWaitMillis" value="${redis.maxWait}"/>        <property name="testOnBorrow" value="${redis.testOnBorrow}"/>    </bean>    <!-- redis服务器中心 -->    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">        <property name="poolConfig" ref="jedisPoolConfig"/>        <property name="hostName" value="${redis.host}"/>        <property name="port" value="${redis.port}"/>        <property name="password" value="${redis.password}"/>        <property name="timeout" value="${redis.timeout}"/>    </bean>    <bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">        <property name="connectionFactory" ref="jedisConnectionFactory"/>        <property name="keySerializer" ref="stringRedisSerializer"/>        <property name="hashKeySerializer" ref="stringRedisSerializer"/>        <property name="valueSerializer" ref="stringRedisSerializer"/>        <property name="hashValueSerializer" ref="stringRedisSerializer"/>    </bean></beans>

引入配置文件

<import resource="classpath:spring/spring-redis.xml"/>

七、Spring整合Redis(集群)

Maven依赖和Redis服务器配置redis.properties跟上面单机的一样

7.1 Spring整合Redis集群配置文件spring-redis-cluster.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://www.springframework.org/schema/beans       http://www.springframework.org/schema/beans/spring-beans.xsd">    <!--redis连接池配置-->    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">        <property name="maxTotal" value="${redis.maxTotal}"/>        <property name="maxIdle" value="${redis.maxIdle}"/>        <property name="minIdle" value="${redis.minIdle}"/>        <property name="maxWaitMillis" value="${redis.maxWait}"/>        <property name="testOnBorrow" value="${redis.testOnBorrow}"/>    </bean>    <!--redis集群配置-->    <bean id="redisClusterConfig" class="org.springframework.data.redis.connection.RedisClusterConfiguration">        <property name="maxRedirects" value="3"/>        <property name="clusterNodes">            <set>                <bean class="org.springframework.data.redis.connection.RedisClusterNode">                    <constructor-arg name="host" value="127.0.0.1"/>                    <constructor-arg name="port" value="6379"/>                </bean>                <bean class="org.springframework.data.redis.connection.RedisClusterNode">                    <constructor-arg name="host" value="192.168.31.245"/>                    <constructor-arg name="port" value="7001"/>                </bean>                <bean class="org.springframework.data.redis.connection.RedisClusterNode">                    <constructor-arg name="host" value="192.168.31.245"/>                    <constructor-arg name="port" value="7002"/>                </bean>                <bean class="org.springframework.data.redis.connection.RedisClusterNode">                    <constructor-arg name="host" value="192.168.31.210"/>                    <constructor-arg name="port" value="7003"/>                </bean>                <bean class="org.springframework.data.redis.connection.RedisClusterNode">                    <constructor-arg name="host" value="192.168.31.210"/>                    <constructor-arg name="port" value="7004"/>                </bean>                <bean class="org.springframework.data.redis.connection.RedisClusterNode">                    <constructor-arg name="host" value="192.168.31.210"/>                    <constructor-arg name="port" value="7005"/>                </bean>            </set>        </property>    </bean>    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">        <constructor-arg name="clusterConfig" ref="redisClusterConfig"/>        <constructor-arg name="poolConfig" ref="jedisPoolConfig"/>        <property name="timeout" value="${redis.timeout}"/>    </bean>    <bean name="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">        <property name="connectionFactory" ref="jedisConnectionFactory"/>        <property name="keySerializer" ref="stringRedisSerializer"/>        <property name="hashKeySerializer" ref="stringRedisSerializer"/>        <property name="valueSerializer" ref="stringRedisSerializer"/>        <property name="hashValueSerializer" ref="stringRedisSerializer"/>    </bean></beans>

引入配置文件

<import resource="classpath:spring/spring-redis-cluster.xml"/>

参考

0 0
原创粉丝点击