
Redis
Redis,Remote Dictionary Server,远程字典服务
6379
概述
是什么
是一个开源的使用ANSI C语言编写、支持网络,可基于内存亦可持久化的日志型、Key-Value数据库,并提供给多种语言的API。
当下最热门的NoSQL技术之一,也被人们称为结构化数据库。
能做什么
内存存储、持久化,内存中是断电即逝的,持久化很重要
持久化,即rdb,aof
效率高,可以用于高速缓存
发布订阅系统
地图信息分析
计时器,计数器(浏览量)
…
特性
- 多样的数据类型
- 持久化
- 集群
- 事务
- …
使用
1 | 127.0.0.1:6379> ping #测试连接 |
1 | yyn@yynlinux:~$ ps -ef | grep redis #查看进程列表并筛选redis |
测试性能
redis-benchmark
1 | -h 指定服务器主机名 127.0.0.1 |
使用
1 | # 测试100个并发连接, 100000请求 |
1 | root@yynlinux:~# redis-benchmark -h localhost -p 6379 -c 100 -n 10000 |
基础知识
Redis默认有16个数据库。默认使用第0个数据库;
使用select进行数据库切换。
1 | 127.0.0.1:6379> select 1 #切换到数据库1 |
select,进行数据库切换
dbsize,查看当前数据库大小
keys *
,查看当前数据库所有的keyflushdb,清空当前数据库
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 | 127.0.0.1:6379> set name yn |
move,移动数据到指定数据库
move name 1
将name移动到数据库1
1 | 127.0.0.1:6379> get name |
expire,设置过期
expire key seconds
: 设置key到seconds秒后过期
1 | 127.0.0.1:6379> get name |
ttl,查看剩余多长时间
ttl key
1 | 127.0.0.1:6379> set name yn |
type,查看数据类型
type key
1 | 127.0.0.1:6379> set name yn |
String(字符串)
命令
设置,获取,追加,获取长度
set key value
:设置值get key
:获取值append key value
:在字符串后面追加值- 若key不存在,则新建key,然后值为追加的值。(相当于set key)
strlen
: 获取字符串长度
1 | 127.0.0.1:6379> set name zhang #设置name值为zhang |
自增,自减,步长
incr key
:若key对应值为一个整数,则实现自增1decr key
:自减1incrby key increment
:自增,可以指定步长decrby key increment
:自减,可以指定步长
1 | 127.0.0.1:6379> set views 0 #设置值 (初始浏览量为0) |
截取,替换
getrange key a b
:获取key对应值从a到b的所有内容(包括a且包括b);
1 | 127.0.0.1:6379> set key1 "hello,ZhangSan" #设置值 |
setrange key offset value
:从offset开始,替换为value。替换指定位置开始的字符串。
1 | 127.0.0.1:6379> get key1 |
设置值同时设置过期时间
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) 481
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 | 127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 # 设置 k1=v1 k2=v2 k3=v3 |
getset
getset key value
:获取值并设置值- 若key不存在,则创建并赋值,返回nil
- 若key存在,返回值并修改值
1 | 127.0.0.1:6379> get k1 |
可以存放什么,可以做什么
字符串,数字
应用场景:计数器,统计数量,粉丝数,对象存储。
使用技巧
技巧不是Redis的基础知识,只是Redis的一些使用技巧。
对象
可以通过“POJO:ID:KEY”的方式设计一个对象,如:
mset user:1:name zhangsan user:1:age 2
设计了一个 user的id为1,属性为:
1 | {"name":"zhangsan","age":2} |
的一个对象。
1 | 127.0.0.1:6379> mset user:1:name zhangsan user:1:age 4 |