全局命令及字符串string

    windows下redis的启动命令:redis-server.exe  redis.conf   

    连接redis的server命令:redis-cli.exe

    Redis 是一个Key-Value内存数据库,不管是何种数据结构,对于键来说有一些通用的命令

查看所有键 keys *

     

    keys命令会遍历所有键, 所以它的时间复杂度是O(n)

键总数dbsize

 dbsize命令会返回当前数据库中键的总数

    dbsize命令在计算键总数时不会遍历所有键, 而是直接获取Redis内置的键总数变量, 所以dbsize命令的时间复杂度是O(1)

检查键是否存在 exists key

 

删除键del key

127.0.0.1:6379> del key1
(integer) 1

 del是一个通用命令, 无论值是什么数据结构类型, del命令都可以将其删除

 返回结果为成功删除键的个数, 假设删除一个不存在的键, 返回0。

键过期expire key seconds

Redis支持对键添加过期时间, 当超过过期时间后, 会自动删除键

ttl命令会返回键的剩余过期时间 ,它有三种返回值

  • 大于等于0的整数: 键剩余的过期时间
  • -1: 键没设置过期时间
  • -2: 键不存在

       set name artisan expire name 20 两句 可以简化成 set name artisan EX 20

键的数据结构类型type key

  键name 是字符串类型, 返回结果为string,
  键list是列表类型, 返回结果为list,
  键user是列表hash, 返回结果为hash

  type命令实际返回的就是当前键的数据结构类型: string(字符串) 、 hash(哈希) 、 list(列表) 、 set(集合) 、 zset(有序集合) , 其实这些只是Redis对外的数据结构。 事实上,Redis内部每种数据结构都有自己底层的内部编码实现, 而且是多种实现,Redis会在合适的场景选择合适的内部编码。

  

  

  通过object encoding命令查询内部编码

   

单线程架构
  Redis使用单线程架构和I/O多路复用模型来实现高性能的内存数据库服务。

为什么Redis使用单线程模型会达到每秒万级别的处理能力呢?

  纯内存访问, Redis将所有数据放在内存中, 内存的响应时长大约为100纳秒, 这是Redis达到每秒万级别访问的重要基础
  非阻塞I/O, Redis使用epoll作为I/O多路复用技术的实现, 再加上Redis自身的事件处理模型将epoll中的连接、 读写、 关闭都转换为事件, 不在网络I/O上浪费过多的时间
  单线程避免了线程切换和竞态产生的消耗。

String
  字符串是 Redis 最基本的数据结构 ,以一个和一个存储于 Redis 内部。字符串类型的值实际可以 是字符串(简单的字符串、 复杂的字符串(例如JSON、 XML) ) 、 数字 (整数、 浮点数) , 甚至是二进制(图片、 音频、 视频) , 但是值最大不能 超过512MB。

  

  

set key value [ex seconds] [px milliseconds] [nx|xx]
  • ex seconds: 为键设置秒级过期时间。

  • px milliseconds: 为键设置毫秒级过期时间。

  • nx: 键必须不存在, 才可以设置成功, 用于添加。

  • xx: 与nx相反, 键必须存在, 才可以设置成功, 用于更新

  设置过期时间

setex key seconds value

 setnx当前键不存在,允许设置

setnx key value

setnx和setxx在实际使用中有什么应用场景吗? 以setnx命令为例子, 由于Redis的单线程命令处理机制, 如果有多个客户端同时执行setnx key value,根据setnx的特性只有一个客户端能设置成功, setnx可以作为分布式锁的一种实现方案。

mset key value [key value ...]
127.0.0.1:6379> mset key1 a key2 b key3 c key4 d key5 5 
OK

批量获取值

 mget key [key ...]
127.0.0.1:6379> mget key1 key2 key3 key4 key5
1) "a"
2) "b"
3) "c"
4) "d"
5) "5"

如果有些键不存在, 那么它的值为nil(空) , 结果是按照传入键的顺序返回:

批量操作命令可以有效提高效率,假如没有mget这样的命令, 要执行n次get命令如下所示

    n次get时间 = n次网络时间 + n次命令时间

使用mget命令后, 要执行n次get命令操作如下

  n次get时间 = 1次网络时间 + n次命令时间

 

  Redis可以支撑每秒数万的读写操作, 但是这指的是Redis服务端的处理能力, 对于客户端来说, 一次命令除了命令时间还是有网络时间, 假设网络时间为1毫秒, 命令时间为0.1毫秒(按照每秒处理1万条命令算) , 那么执行1000次get命令和1次mget命令如下

  因为Redis的处理能力已经足够高,所以 网络可能会成为性能的瓶颈。

  使用批量操作, 有助于提高业务处理效率, 但是要注意的是每次批量操作所发送的命令数不是无节制的, 如果数量过多可能造成Redis阻塞或者网络拥塞。

string的内部编码

  字符串类型的3种内部编码

  1. int: 8个字节的长整型

  2. embstr: 小于等于39个字节的字符串

  3. raw: 大于39个字节的字符串

  Redis会根据当前值的类型和长度决定使用哪种内部编码实现。

Redis中对整数和浮点型数字的支持

  对整数和浮点型数字的功能,如果字符串是数字(整数或者浮点数〉,那么 Redis 还能支持简单的运算

  

  如果开始把val 设置为浮点数,那么 incr、 decr、 incrby 、 decrby 的命令都会失败。 Redis 并不支持减法 、 乘法、除法操作,功能十分有限,需要注意。

      RedisTemplate的opsForValue常用方法:

      set(K key,V value):  新增一个字符串类型的值,key是键,value是值。

  1. redisTemplate.opsForValue().set("stringValue","bbb");  

      get(Object key) : 获取key键对应的值

    String stringValue = redisTemplate.opsForValue().get("stringValue")+"";

      append(K key,String value): 在原有的值基础上新增字符串到末尾

  1. redisTemplate.opsForValue().append("stringValue","aaa");  

      get(K key,long start,long end):

         截取key键对应值得字符串,从开始下标位置开始到结束下标的位置(包含结束下标)的字符串

 

       对于减法, RedisTemplate 并没有进行支持。 所以用下面的代码去代替它 

redisTemplate . getConnectionFactory() .getConnection() . decrBy(redisTemplate.getKeySerializer() . serialize ("number") , 10) ;

  通过获得连接工厂获得连接从而得到底层的 Redis 连接对象。为了和 RedisTemplate的配置保持一致 ,所以先获取其 keySerializer 属性 ,对键进行序列化,如果获取结果也可以进行同样的转换。

  当然 getConnection()只是获取一个 spring data redis 项目中封装的底层对象 RedisConnection , 甚至可以获取原始的链接对象Jedis 对象。

Jedis jedis =(Jedis)redisTemplate.getConnectionFactory() .getConnection() .getNativeConnection() ;

  关于减法的方法,原有值都必须是整数,否则就会引发异常.

// 如果进行减法运算原有值都必须是整数,否则就会引发异常,比如下面的,编译通过,但运行会抛出异常
redisTemplate.opsForValue().set("number", "1.1");
redisTemplate.getConnectionFactory().getConnection().decr(redisTemplate.getKeySerializer().serialize("number"));


Exception in thread "main" org.springframework.dao.InvalidDataAccessApiUsageException: ERR value is not an integer or out of 
range; nested exception is redis.clients.jedis.exceptions.JedisDataException: ERR value is not an integer or out of range

参考:https://blog.csdn.net/yangshangwei/article/details/82251931#_238

posted on 2019-01-26 22:45  溪水静幽  阅读(345)  评论(0)    收藏  举报