那些年我们一起错过redis
《那些年我们一起错过redis》要点: 1jedis介绍 Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js、Go等. 在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson. 在企业中用的最多的就是Jedis. Jedis同样也是托管在github上,地址:https://github.com/xetorthio/jedis 1.1工程搭建 首先搭建一个工程项目测试一下,添加jar包 单实例连接redis 使用jedis连接池连接redis服务器 ?添加spring的jar包 ?配置spring配置文件applicationContext.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" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd "> <!-- 连接池配置 --> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <!-- 最大连接数 --> <property name="maxTotal" value="30" /> <!-- 最大空闲连接数 --> <property name="maxIdle" value="10" /> <!-- 每次释放连接的最大数目 --> <property name="numTestsPerEvictionRun" value="1024" /> <!-- 释放连接的扫描间隔(毫秒) --> <property name="timeBetweenEvictionRunsMillis" value="30000" /> <!-- 连接最小空闲时间 --> <property name="minEvictableIdleTimeMillis" value="1800000" /> <!-- 连接空闲多久后释放,当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 --> <property name="softMinEvictableIdleTimeMillis" value="10000" /> <!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 --> <property name="maxWaitMillis" value="1500" /> <!-- 在获取连接的时候检查有效性,默认false --> <property name="testOnBorrow" value="false" /> <!-- 在空闲时检查有效性,默认false --> <property name="testWhileIdle" value="true" /> <!-- 连接耗尽时是否阻塞,false报异常,ture阻塞直到超时,默认true --> <property name="blockWhenExhausted" value="false" /> </bean> <!-- redis单机 通过连接池 --> <bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="close"> <constructor-arg name="poolConfig" ref="jedisPoolConfig" /> <constructor-arg name="host" value="192.168.242.130" /> <constructor-arg name="port" value="6379" /> </bean> </beans> @Test public void testJedisPool() { JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool"); Jedis jedis = null; try { jedis = pool.getResource(); jedis.set("name","lisi"); String name = jedis.get("name"); System.out.println(name); } catch (Exception ex) { ex.printStackTrace(); } finally { if (jedis != null) { // 关闭连接 jedis.close(); } } } 1.2 Redis数据类型 1.2.1String 1.2.1.1命令 1.2.1.1.1赋值 语法:SET key value 127.0.0.1:6379> set test 123 OK 1.2.1.1.2取值 语法:GET key 127.0.0.1:6379> get test "123“ 1.2.1.1.3取值并赋值 语法:GETSET key value 127.0.0.1:6379> getset s2 222 "111" 127.0.0.1:6379> get s2 "222" 1.2.1.1.4设置/获取多个键值 语法: MSET key value [key value …] MGET key [key …] 127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 OK 127.0.0.1:6379> get k1 "v1" 127.0.0.1:6379> mget k1 k3 1) "v1" 2) "v3" 1.2.1.1.5删除 语法:DEL key 127.0.0.1:6379> del test (integer) 1 1.2.1.1.6数值增减 n递增数字 当存储的字符串是整数时,Redis提供了一个实用的命令INCR,其作用是让当前键值递增,并返回递增后的值. 语法:INCR key 127.0.0.1:6379> incr num (integer) 1 127.0.0.1:6379> incr num (integer) 2 127.0.0.1:6379> incr num (integer) 3 n增加指定的整数 语法:INCRBY key increment 127.0.0.1:6379> incrby num 2 (integer) 5 127.0.0.1:6379> incrby num 2 (integer) 7 127.0.0.1:6379> incrby num 2 (integer) 9 n递减数值 语法:DECR key 127.0.0.1:6379> decr num (integer) 9 127.0.0.1:6379> decr num (integer) 8 n减少指定的整数 语法:DECRBY key decrement 127.0.0.1:6379> decr num (integer) 6 127.0.0.1:6379> decr num (integer) 5 127.0.0.1:6379> decrby num 3 (integer) 2 127.0.0.1:6379> decrby num 3 (integer) -1 1.2.1.1.7向尾部追加值 APPEND的作用是向键值的末尾追加value.如果键不存在则将该键的值设置为value,即相当于 SET key value.返回值是追加后字符串的总长度. 语法:APPEND key value 127.0.0.1:6379> set str hello OK 127.0.0.1:6379> append str " world!" (integer) 12 127.0.0.1:6379> get str "hello world!" 1.2.1.1.8 获取字符串长度 STRLEN命令返回键值的长度,如果键不存在则返回0. 语法:STRLEN key 127.0.0.1:6379> strlen str (integer) 0 127.0.0.1:6379> set str hello OK 127.0.0.1:6379> strlen str (integer) 5 做个简单的小应用>>自增主键 商品编号、订单号采用string的递增数字特性生成. 定义商品编号key:items:id 192.168.101.3:7003> INCR items:id (integer) 2 192.168.101.3:7003> INCR items:id (integer) 3 2 Hash 散列类型 2.1使用string的问题 假设有User对象以JSON序列化的形式存储到Redis中,User对象有id,username、password、age、name等属性,存储的过程如下: 保存、更新: User对象 à json(string) à redis 如果在业务上只是更新age属性,其他的属性并不做更新我应该怎么做呢? 如果仍然采用上边的方法在传输、处理时会造成资源浪费,下边讲的hash可以很好的解决这个问题. 2.1.2redis hash介绍 hash叫散列类型,它提供了字段和字段值的映射.字段值只能是字符串类型,不支持散列类型、集合类型等其它类型.如下: 2.1.3命令 2.1.3.1赋值 HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0. ?一次只能设置一个字段值 语法:HSET key field value 127.0.0.1:6379> hset user username zhangsan (integer) 1 ?一次可以设置多个字段值 语法:HMSET key field value [field value ...] 127.0.0.1:6379> hmset user age 20 username lisi OK ?当字段不存在时赋值,类似HSET,区别在于如果字段存在,该命令不执行任何操作 语法:HSETNX key field value 127.0.0.1:6379> hsetnx user age 30 如果user中没有age字段则设置age值为30,否则不做任何操作 (integer) 0 2.1.3.2取值 ?一次只能获取一个字段值 语法:HGET key field 127.0.0.1:6379> hget user username "zhangsan“ ?一次可以获取多个字段值 语法:HMGET key field [field ...] 127.0.0.1:6379> hmget user age username 1) "20" 2) "lisi" ?获取所有字段值 语法:HGETALL key 127.0.0.1:6379> hgetall user 1) "age" 2) "20" 3) "username" 4) "lisi" 2.1.3.3删除字段 可以删除一个或多个字段,返回值是被删除的字段个数 语法:HDEL key field [field ...] 127.0.0.1:6379> hdel user age (integer) 1 127.0.0.1:6379> hdel user age name (integer) 0 127.0.0.1:6379> hdel user age username (integer) 1 2.1.3.4增加数字 语法:HINCRBY key field increment 127.0.0.1:6379> hincrby user age 2 将用户的年龄加2 (integer) 22 127.0.0.1:6379> hget user age 获取用户的年龄 "22“ 2.1.3.4.1判断字段是否存在 语法:HEXISTS key field 127.0.0.1:6379> hexists user age 查看user中是否有age字段 (integer) 1 127.0.0.1:6379> hexists user name 查看user中是否有name字段 (integer) 0 2.1.3.4.2只获取字段名或字段值 语法: HKEYS key HVALS key 127.0.0.1:6379> hmset user age 20 name lisi OK 127.0.0.1:6379> hkeys user 1) "age" 2) "name" 127.0.0.1:6379> hvals user 1) "20" 2) "lisi" 2.1.3.4.3获取字段数量 语法:HLEN key 127.0.0.1:6379> hlen user (integer) 2 3.1List 3.1.1Arraylist和linkedlist的区别 Arraylist是使用数组来存储数据,特点:查询快、增删慢 Linkedlist是使用双向链表存储数据,特点:增删快、查询慢,但是查询链表两端的数据也很快. Redis的list是采用来链表来存储的,所以对于redis的list数据类型的操作,是操作list的两端数据来操作的. 3.1.2命令 3.1.2.1向列表两端增加元素 ?向列表左边增加元素 语法:LPUSH key value [value ...] 127.0.0.1:6379> lpush list:1 1 2 3 (integer) 3 ?向列表右边增加元素 语法:RPUSH key value [value ...] 127.0.0.1:6379> rpush list:1 4 5 6 (integer) 3 3.1.2.2查看列表 LRANGE命令是列表类型最常用的命令之一,获取列表中的某一片段,将返回start、stop之间的所有元素(包含两端的元素),索引从0开始.索引可以是负数,如:“-1”代表最后边的一个元素. 语法:LRANGE key start stop 127.0.0.1:6379> lrange list:1 0 2 1) "2" 2) "1" 3) "4" 127.0.0.1:6379> lrange list1 0 -1 3.1.2.3从列表两端弹出元素 LPOP命令从列表左边弹出一个元素,会分两步完成: 第一步是将列表左边的元素从列表中移除 第二步是返回被移除的元素值. 语法: LPOP key RPOP key 127.0.0.1:6379> lpop list:1 "3“ 127.0.0.1:6379> rpop list:1 "6“ 3.1.2.4获取列表中元素的个数 语法:LLEN key 127.0.0.1:6379> llen list:1 (integer) 2 3.1.2.5删除列表中指定的值 LREM命令会删除列表中前count个值为value的元素,返回实际删除的元素个数.根据count值的不同,该命令的执行方式会有所不同: l当count>0时,LREM会从列表左边开始删除. l当count<0时,LREM会从列表后边开始删除. l当count=0时,LREM删除所有值为value的元素. 语法:LREM key count value 3.1.2.6 获得/设置指定索引的元素值 ?获得指定索引的元素值 语法:LINDEX key index 127.0.0.1:6379> lindex l:list 2 "1" ?设置指定索引的元素值 语法:LSET key index value 127.0.0.1:6379> lset l:list 2 2 OK 127.0.0.1:6379> lrange l:list 0 -1 1) "6" 2) "5" 3) "2" 4) "2" 3.1.2.7 只保留列表指定片段 指定范围和LRANGE一致 语法:LTRIM key start stop 127.0.0.1:6379> lrange l:list 0 -1 1) "6" 2) "5" 3) "0" 4) "2" 127.0.0.1:6379> ltrim l:list 0 2 OK 127.0.0.1:6379> lrange l:list 0 -1 1) "6" 2) "5" 3) "0" 3.1.2.8 向列表中插入元素 该命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面. 语法:LINSERT key BEFORE|AFTER pivot value 127.0.0.1:6379> lrange list 0 -1 1) "3" 2) "2" 3) "1" 127.0.0.1:6379> linsert list after 3 4 (integer) 4 127.0.0.1:6379> lrange list 0 -1 1) "3" 2) "4" 3) "2" 4) "1" 3.1.2.9 将元素从一个列表转移到另一个列表中 语法:RPOPLPUSH source destination 127.0.0.1:6379> rpoplpush list newlist "1" 127.0.0.1:6379> lrange newlist 0 -1 1) "1" 127.0.0.1:6379> lrange list 0 -1 1) "3" 2) "4" 3) "2" 欢迎参与《那些年我们一起错过redis》讨论,分享您的想法,编程之家PHP学院为您提供专业教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |