字符串类型是Redis中最基本的数据类型,能存储任何形式的字符串和和二进制数据。本文以代码形式列举常用的操作命令,并在实践部分演示一个简单的商品管理功能,实现了通常使用关系型数据库开发的增改查功能,注意并没有实现删除功能,这将放在后面的列表类型中去实现。
一、常用命令
pom.xml
<dependencies> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.8</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.4</version> </dependency> </dependencies>StringExample.java
import java.util.Iterator; import java.util.List; import java.util.Set; import redis.clients.jedis.Jedis; public class StringExample { public static void main(String[] args) { Jedis jedis = JedisProvider.getJedis(); //清空数据库 jedis.flushDB(); String key = "redis_str"; //判断key是否存在 boolean exists = jedis.exists(key); if (exists) { //删除key,返回实际删除的行数 long l = jedis.del(key); print("del " + key + "=" + l); } //新增key,成功返回 OK String result = jedis.set(key, "a string value"); print("set " + key + "=" + result); //读取value长度 print("strlen(" + key + ")=" + jedis.strlen(key)); //读取value String value = jedis.get(key); print("get " + key + "=" + value); //设置过期时间为5秒 jedis.expire(key, 5); //查看某个key的剩余生存时间,单位秒,永久生存或者不存在的都返回-1 Long ttl = jedis.ttl(key); print("ttl of " + key + "=" + ttl); //移除某个key的生存时间 jedis.persist(key); print("移除生存时间后 ttl of " + key + "=" + jedis.ttl(key)); //查看key所储存的值的类型 String type = jedis.type(key); print("type of " + key + "=" + type); //一次性新增多个key jedis.mset("key001", "value001", "key002", "value002", "key003", "value003", "key004", "value004"); print("批量设置key: key001,key002,key003,key004"); //读取所有key,遍历,判断类型 System.out.println("读取所有key并筛选string类型"); Set<String> keys = jedis.keys("*"); Iterator<String> it = keys.iterator(); while (it.hasNext()) { key = it.next(); if (jedis.type(key).equals("string")) System.out.println("get " + key + "=" + jedis.get(key)); } System.out.println("------------------------------------------------------"); System.out.println(); //一次性获取多个key值 System.out.println("批量读取key: key001,key002,key003,key004"); List<String> list = jedis.mget("key001", "key002", "key003", "key004"); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } System.out.println("------------------------------------------------------"); System.out.println(); //一次性删除多个key,返回成功删除个数 Long del = jedis.del(new String[] { "key001", "key002" }); print("[批量删除]del key001,key002=" + del); // 禁止覆盖 Long setnx = jedis.setnx("key003", "value003_new"); print("[禁止覆盖]setnx key003 to value003_new=" + setnx + "; value=" + jedis.get("key003")); //新增key同时设置有效期(秒) result = jedis.setex(key, 3, "setex demo"); print("setex " + key + "(ttl 3)=" + result + "; value=" + jedis.get(key) + "; ttl=" + jedis.ttl(key)); try { Thread.sleep(4000); } catch (InterruptedException e) { } print("[4秒之后]get " + key + "=" + jedis.get(key)); //获取原值, 更新为新值一步完成 key = "key003"; String former = jedis.getSet(key, "value002-after-getset"); print("getSet 原值:" + former + "; 新值" + jedis.get(key)); //incr 自增 key = "redis_num"; jedis.del(key); long incr = jedis.incr(key); print("incr " + key + " = " + incr); incr = jedis.incr(key); print("incr " + key + " = " + incr); incr = jedis.incrBy(key, 100); print("incrBy " + key + " 100 = " + incr); Long decr = jedis.decrBy(key, 100); print("decrBy " + key + " 100 = " + decr); jedis.close(); } private static void print(String info) { System.out.println(info); System.out.println("------------------------------------------------------"); System.out.println(); } }JedisProvider.java
import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class JedisProvider { private static JedisPool pool; public static Jedis getJedis() { if(pool == null) { JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(1024); config.setMaxIdle(200); config.setMaxWaitMillis(1000); config.setTestOnBorrow(true); config.setTestOnReturn(true); pool = new JedisPool(config, "127.0.0.1", 6380); } return pool.getResource(); } }
二、实践练习
StringLession.java
import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.math.NumberUtils; import redis.clients.jedis.Jedis; public class StringLession { public static void main(String[] args) { StringLession sl = new StringLession(); sl.clear(); //添加一批商品 for(int i = 0; i< 41; i++) { Goods goods = new Goods(0, "goods" + String.format("%05d", i), i); sl.addGoods(goods); } //读取商品总数 System.out.println("商品总数: " + sl.getTotalCount()); //分页显示 List<Goods> list = sl.getGoodsList(2, 20); System.out.println("第二页商品:"); for(Goods goods : list) { System.out.println(goods); } } private Jedis jedis = null; public StringLession() { this.jedis = JedisProvider.getJedis(); } /** * 获得一个自增主键值 * @return */ private long getIncrementId() { String key = "goods:count"; return jedis.incr(key); } /** * 添加一个商品 * @param goods * @return */ public boolean addGoods(Goods goods) { long id = getIncrementId(); goods.setId(id); String key = "goods:" + id; return jedis.set(key, goods.toString()).equals("OK"); } /** * 修改商品 * @param goods * @return */ public boolean editGoods(Goods goods) { String key = "goods:" + goods.getId(); if(jedis.exists(key)) { return jedis.set(key, goods.toString()).equals("OK"); } return false; } /** * 读取商品总数 * @return */ public long getTotalCount() { String key = "goods:count"; return NumberUtils.toLong(jedis.get(key)); } /** * 读取用于分页的商品列表 * @param pageIndex 页数 * @param pageSize 每页显示行数 * @return */ public List<Goods> getGoodsList(int pageIndex, int pageSize) { int totals = (int)getTotalCount(); int from = (pageIndex - 1) * pageSize; if(from < 0) { from = 0; } else if(from > totals) { from = (totals / pageSize) * pageSize; } int to = from + pageSize; if(to > totals) { to = totals; } String[] keys = new String[(int)(to - from)]; for(int i = from; i < to; i++) { keys[i - from] = "goods:" + (i + 1); } List<String> list = jedis.mget(keys); List<Goods> goodsList = new ArrayList<>(); for(String value : list) { goodsList.add(Goods.parseJson(value)); } return goodsList; } public void clear() { jedis.flushDB(); } }Goods.java
import com.alibaba.fastjson.JSON; public class Goods { public Goods() {} public Goods(long id, String title, float price) { super(); this.id = id; this.title = title; this.price = price; } private long id; private String title; private float price; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } public String toString() { return JSON.toJSONString(this); } public static Goods parseJson(String json) { return JSON.parseObject(json, Goods.class); } }
Redis从基础命令到实战之散列类型(Hash)
Redis从基础命令到实战之列表类型(List)
Redis从基础命令到实战之集合类型(Set)
Redis从基础命令到实战之有序集合类型(SortedSet)