Redis restudy 2 基础 Redis-key String
uwupu 啦啦啦啦啦

Redis

Redis,Remote Dictionary Server,远程字典服务

6379

概述

是什么

是一个开源的使用ANSI C语言编写、支持网络,可基于内存亦可持久化的日志型、Key-Value数据库,并提供给多种语言的API。

当下最热门的NoSQL技术之一,也被人们称为结构化数据库。

能做什么

  1. 内存存储、持久化,内存中是断电即逝的,持久化很重要

    持久化,即rdb,aof

  2. 效率高,可以用于高速缓存

  3. 发布订阅系统

  4. 地图信息分析

  5. 计时器,计数器(浏览量)

特性

  1. 多样的数据类型
  2. 持久化
  3. 集群
  4. 事务

使用

1
2
3
4
5
6
7
127.0.0.1:6379> ping  #测试连接
PONG
127.0.0.1:6379> set name yn #设置值
OK
127.0.0.1:6379>
127.0.0.1:6379> get name #获取值
"yn"
1
2
3
4
yyn@yynlinux:~$ ps -ef | grep redis  #查看进程列表并筛选redis
redis 673 1 0 09:56 ? 00:00:48 /usr/bin/redis-server 0.0.0.0:6379
yyn 9224 9029 0 11:20 pts/0 00:00:00 grep --color=auto redis

测试性能

redis-benchmark

1
2
3
4
5
6
7
8
9
10
11
12
13
-h 指定服务器主机名 127.0.0.1
-p 指定服务器端口 6379
-s 指定服务器socket
-c 指定并发连接数 50
-n 指定请求数 10000
-d 以字节形式指定SET/GET数据大小 2
-k 1=keep alive 0=reconnect
-r set/get/incr使用随机key,SADD使用随机值
-P 通过管道传输<numreq>请求
-q 强制退出redis,仅显示query/sec值
-csv 以csv格式输出
-l 生成循环,永久执行测试
-t 仅运行以逗号分割的测试命令列表

使用

1
2
# 测试100个并发连接, 100000请求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
root@yynlinux:~# redis-benchmark -h localhost -p 6379 -c 100 -n 10000
====== PING_INLINE ======
10000 requests completed in 3.77 seconds # 10000请求
100 parallel clients # 100并发客户端
3 bytes payload # 每次写入3字节
keep alive: 1 # 只有一台服务器处理这些请求,单机性能
host configuration "save": 900 1 300 10 60 10000
host configuration "appendonly": no
multi-thread: no

0.01% <= 6 milliseconds
0.02% <= 7 milliseconds
0.17% <= 8 milliseconds
...
100.00% <= 56 milliseconds # 所有请求在56毫秒内处理完成
2655.34 requests per second #每秒处理2655个请求

====== PING_BULK ======
10000 requests completed in 3.72 seconds
100 parallel clients
3 bytes payload
keep alive: 1
host configuration "save": 900 1 300 10 60 10000
host configuration "appendonly": no
multi-thread: no

0.01% <= 7 milliseconds
0.33% <= 8 milliseconds
...
99.94% <= 73 milliseconds
100.00% <= 74 milliseconds
2687.45 requests per second

基础知识

Redis默认有16个数据库。默认使用第0个数据库;

使用select进行数据库切换。

1
2
3
4
5
6
7
8
9
10
11
12
13
127.0.0.1:6379> select 1 #切换到数据库1
OK
127.0.0.1:6379[1]> select 2 #切换到数据库2
OK
127.0.0.1:6379[2]> set name yn #设置一个值
OK
127.0.0.1:6379[2]> dbsize #查看当前数据库大小
(integer) 1
127.0.0.1:6379[2]> keys * #查看所有的key
1) "name"
127.0.0.1:6379[2]> get name
"yn"

  • select,进行数据库切换

  • dbsize,查看当前数据库大小

  • keys * ,查看当前数据库所有的key

  • flushdb,清空当前数据库

  • flushall,清除所有数据库内容

Redis是单线程的

Redis很快。

官方表示:Redis基于内存操作,CPU不是Redis性能瓶颈,Redis瓶颈是机器内存和网络带宽,既然可以使用单线程,所以就使用单线程了。

Redis为什么单线程这么快?

Redis是将所有数据全部放在内存中的,使用单线程去操作效率就是最高的,多线程会上下文切换,对于内存系统来说,如果没有上下文切换,效率就是最高的。多次读写都是在一个CPU,在内存情况下,单线程就是最佳方案。

介绍

可以用作:数据库缓存消息中间件

支持strings字符串,hashes散列,lists列表,sets集合,sorted sets有序集合与范围查询;

bitmaps,hyperloglogs和geospatial地理空间索引半径查询。

内置复制replication、LUA脚本、LRU驱动事件,事务和不同级别的磁盘持久化;

并通过Redis哨兵Sentinel和自动分区Cluster提高可用性。

数据类型

五大数据类型:Redis-key,String,List,Set,Hash,Zset

三种特殊数据类型:geospatial,hyperloglogs,bitmaps

Redis-Key

exists,查看键值是存在。

1
2
3
4
5
6
7
127.0.0.1:6379> set name yn
OK
127.0.0.1:6379> exists name # 查看name是否存在
(integer) 1 # 1表示存在
127.0.0.1:6379> exists names
(integer) 0 # 0表示不存在

move,移动数据到指定数据库

move name 1将name移动到数据库1

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> get name
"yn"
127.0.0.1:6379> move name 1
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get name
"yn"

expire,设置过期

expire key seconds: 设置key到seconds秒后过期

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> get name
"yn"
127.0.0.1:6379> expire name 10 # 设置name在10秒后过期
(integer) 1
127.0.0.1:6379> get name
"yn"
127.0.0.1:6379> get name #10秒后
(nil)

ttl,查看剩余多长时间

ttl key

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
127.0.0.1:6379> set name yn
OK
127.0.0.1:6379> ttl name
(integer) -1
127.0.0.1:6379> expire name 10
(integer) 1
127.0.0.1:6379> ttl name
(integer) 8
127.0.0.1:6379> ttl name
(integer) 6
127.0.0.1:6379> ttl name
(integer) 2
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> get name
(nil)

type,查看数据类型

type key

1
2
3
4
127.0.0.1:6379> set name yn
OK
127.0.0.1:6379> type name
string

String(字符串)

命令

设置,获取,追加,获取长度

  • set key value:设置值

  • get key :获取值

  • append key value:在字符串后面追加值

    • 若key不存在,则新建key,然后值为追加的值。(相当于set key)
  • strlen: 获取字符串长度

1
2
3
4
5
6
7
8
9
10
11
12
127.0.0.1:6379> set name zhang  #设置name值为zhang
OK
127.0.0.1:6379> get name # 获取name的值
"zhang"
127.0.0.1:6379> strlen name # 获取name值的长度
(integer) 5
127.0.0.1:6379> append name San #在name值后面追加San
(integer) 8
127.0.0.1:6379> strlen name # 获取name值的长度
(integer) 8
127.0.0.1:6379> get name # 获取name值
"zhangSan"

自增,自减,步长

  • incr key:若key对应值为一个整数,则实现自增1
  • decr key:自减1
  • incrby key increment:自增,可以指定步长
  • decrby key increment:自减,可以指定步长
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
127.0.0.1:6379> set views 0  #设置值  (初始浏览量为0)
OK
127.0.0.1:6379>
127.0.0.1:6379> incr views # 自增 (浏览量变为1)
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views #获取值
"2"
127.0.0.1:6379> decr views #自减
(integer) 1
127.0.0.1:6379> get views
"1"
127.0.0.1:6379> incrby views 6 # 自增,步长为6
(integer) 7
127.0.0.1:6379> decrby views 4 # 自减,步长为4
(integer) 3

截取,替换

  • getrange key a b:获取key对应值从a到b的所有内容(包括a且包括b);
1
2
3
4
5
6
7
8
9
10
11
127.0.0.1:6379> set key1 "hello,ZhangSan" #设置值
OK
127.0.0.1:6379> get key1
"hello,ZhangSan"
127.0.0.1:6379> getrange key1 0 3 #截取字符串
"hell"
127.0.0.1:6379> getrange key1 0 -1 # -1表示倒数第1个字符
"hello,ZhangSan"
127.0.0.1:6379> getrange key1 -3 -1 # 截取字符串 倒数第3个字符到倒数第1个字符的内容
"San"

  • setrange key offset value:从offset开始,替换为value。替换指定位置开始的字符串。
1
2
3
4
5
6
127.0.0.1:6379> get key1
"hello,ZhangSan"
127.0.0.1:6379> setrange key1 3 xxxx
(integer) 14
127.0.0.1:6379> get key1
"helxxxxhangSan"

设置值同时设置过期时间

  • setex (set with expire):设置值的同时设置过期时间

    • setex key expire value

    • ```bash
      127.0.0.1:6379> setex key3 60 qqweasd #设置key3的值,过期时间为60秒
      OK
      127.0.0.1:6379> get key3
      “qqweasd”
      127.0.0.1:6379> ttl key3
      (integer) 50
      127.0.0.1:6379> ttl key3
      (integer) 48

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20

      ### 若值不存在则设置,否则失败

      - setnx (set if nost exist):不存在则进行set

      - setnx key value

      - 在分布式锁中会常常使用。

      - ```bash
      127.0.0.1:6379> mget key4 key5 # key4值为qqqwwweeee,key5没有值
      1) "qqqwwweeee"
      2) (nil)
      127.0.0.1:6379> setnx key4 qweasd # 设置key4值为qweasd
      (integer) 0 #失败
      127.0.0.1:6379> setnx key5 aaaaaa # 设置key5值为aaaaaa
      (integer) 1 #成功
      127.0.0.1:6379> mget key4 key5
      1) "qqqwwweeee" # key4并没有被set
      2) "aaaaaa" # key5值set成功

mset, mget, msetnx

  • mset key value [key value ...]:可以一次设置多个值;
  • mget key [key ...]:可以一次获取多个值
  • msetnx key value [key value ...]:设置多个值,若值不存在则设置。
    • 这是一个原子性操作,要么一起成功,要么一起失败。
1
2
3
4
5
6
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 # 设置 k1=v1 k2=v2 k3=v3
OK
127.0.0.1:6379> mget k1 k2 k3 # 获取多个值
1) "v1"
2) "v2"
3) "v3"

getset

  • getset key value:获取值并设置值
    • 若key不存在,则创建并赋值,返回nil
    • 若key存在,返回值并修改值
1
2
3
4
5
6
127.0.0.1:6379> get k1
(nil)
127.0.0.1:6379> getset k1 qweasd # 获取值,但是k1没有值,此时设置值
(nil)
127.0.0.1:6379> get k1
"qweasd"

可以存放什么,可以做什么

字符串,数字

应用场景:计数器,统计数量,粉丝数,对象存储。

使用技巧

技巧不是Redis的基础知识,只是Redis的一些使用技巧。

对象

可以通过“POJO:ID:KEY”的方式设计一个对象,如:

mset user:1:name zhangsan user:1:age 2

设计了一个 user的id为1,属性为:

1
{"name":"zhangsan","age":2}

的一个对象。

1
2
3
4
5
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 4
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "4"
 评论