6、Redis默认不是后台启动,需要修改配置文件
vim redis.conf
7、启动Redis,redis-server 通过制定的配置文件启动
redis-server my_redis_config/redis.conf
8、使用 redis-cli 进行测试连接
9、查看Redis进程是否开启
10、如何关闭Redis服务
11、再次查看进程是否存在
12、后面我们会使用单机多Redis启动集群测试!
2.4、测试性能
redis-benchmark 是一个压力测试工具,官方自带的性能测试工具。
redis 性能测试的基本命令如下:
redis-benchmark [option] [option value]
redis 性能测试工具可选参数如下所示(来自菜鸟教程)
我们来简单的测试一下
# 测试100个并发连接,100000请求 redis-benchmark -h localhost -p 6379 -c 100 -n 100000
如何查看这些分析?
2.5、Redis基础知识
Redis默认有16个数据库(可查看看配置文件)
默认使用的是第0个数据库
可以使用 select 进行切换数据库(例如切换为3号数据库)
127.0.0.1:6379> select 3 # 切换数据库 OK 127.0.0.1:6379[3]> dbsize # 查看db大小 (integer) 0 127.0.0.1:6379[3]>
查看当前数据库所有key
127.0.0.1:6379[3]> keys * # 查看当前数据库所有key 1) "name" 127.0.0.1:6379[3]>
清除当前数据库与清除全部数据库内容
127.0.0.1:6379[3]> flushdb # 清空数据库 OK 127.0.0.1:6379[3]> keys * (empty array) # flushall 清空全部数据库内容
思考:redis的端口号为什么是6379?(可网上查询,了解即可)
Redis是单线程的!(6.0版本以上,Redis网络处理是多线程)
官方表示Redis是很快的,Redis是给予内存操作的,CPU不是Redis的性能瓶颈,Redis的瓶颈是根据机器的内存和网络宽带,既然可以使用单线程来实现,就使用单线程了!
Redis是C 语言写的,官方提供的数据为100000+的QPS,完全不比同样是使用key-vale的Memecache差!
Redis为什么使用单线程还这么快?
误区1∶高性能的服务器一定是多线程的? 误区2∶多线程(CPU上下文会切换!)一定比单线程效率高!
速度快的原因:
核心:redis是将所有的数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文会切换︰耗时的操作! ! ! ),对于内存系统来说,如果没有上下文切换效率就是最高的!多次读写都是在一个CPU上,在内存情况下,这种方案才是最佳的。
3、Redis五大数据类型
官方文档 Redis可以作为数据库、缓存、消息中间件
/* Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作 数据库、缓存和消息中间件 (MQ)。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合 (sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction), 事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster) 提供高可用性(high availability */
3.1、Redis-key 学习
127.0.0.1:6379> keys * # 查看所有key (empty array) 127.0.0.1:6379> set name howie OK 127.0.0.1:6379> exists name # 判断key是否存在 (integer) 1 127.0.0.1:6379> move name 3 # 移动当前key到制定的数据库 (integer) 1 127.0.0.1:6379> set age 21 OK 127.0.0.1:6379> expire age 10 # 设置key的过期时间,单位是秒 (integer) 1 127.0.0.1:6379> ttl name # 查看当前key的剩余时间,单位是秒,负数代表当前key以到期 (integer) -2 127.0.0.1:6379> keys * 1) "age" 2) "name" 127.0.0.1:6379> type name # 查看当前key的数据类型 string 127.0.0.1:6379> type age string
Redis的命令远不止这些,全部拿来学习也不现实,所以遇到不会的命令,我们要学会在官网上查询
官网命令查询地址:http://www.redis.cn/commands.html
3.2、String(字符串)
1、追加与获取长度
127.0.0.1:6379> set str "hello" # 设置值 OK 127.0.0.1:6379> get str # 获取值 "hello" 127.0.0.1:6379> append str " world" # 追加字符串,如果当前字符串不存在,就相当于set key (integer) 11 127.0.0.1:6379> get str "hello world" 127.0.0.1:6379> strlen str # 获取字符串长度 (integer) 11
2、自增/减,指定步长自增/减
127.0.0.1:6379> set views 0 OK 127.0.0.1:6379> get views "0" 127.0.0.1:6379> incr views # 自增1 (integer) 1 127.0.0.1:6379> get views "1" 127.0.0.1:6379> incr views (integer) 2 127.0.0.1:6379> decr views # 自减1 (integer) 1 127.0.0.1:6379> incrby views 9 # 指定步长,自增 (integer) 10 127.0.0.1:6379> get views "10" 127.0.0.1:6379> decrby views 9 # 指定步长,自减 (integer) 1 127.0.0.1:6379> get views "1"
3、字符串范围 getrange
127.0.0.1:6379> set str "hello world" OK 127.0.0.1:6379> getrange str 0 1 # 截取闭区间的子字符串,索引从0开始[0,1] "he" 127.0.0.1:6379> getrange str 0 -1 # 获取全部字符串,这里和get key 是一样的 "hello world"
4、替换 setrange
127.0.0.1:6379> get str "hello world" 127.0.0.1:6379> setrange str 6 "Java" # 替换指定位置开始的字符串 (integer) 11 127.0.0.1:6379> getrange str 0 -1 "hello Javad" setex # set with expire 设置过期时间 setnx # set if not exist 不存在再设置(在分布式锁中经常使用) 127.0.0.1:6379> setex age 30 "21" # 设置过期时间 OK 127.0.0.1:6379> ttl age (integer) 25 127.0.0.1:6379> get ge (nil) 127.0.0.1:6379> set name "alex" OK 127.0.0.1:6379> get name "alex" 127.0.0.1:6379> setnx name "Java" # 设置key-value,如果key存在,不会覆盖,并且返回0,表示设置失败 (integer) 0 127.0.0.1:6379> get name "alex"
5、批量设置(mset)和获取(mget)
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 # 批量设置 OK 127.0.0.1:6379> keys * # 查看所有的key 1) "k2" 2) "k1" 3) "k3" 127.0.0.1:6379> mget k1 k2 k3 # 批量获取 1) "v1" 2) "v2" 3) "v3" 127.0.0.1:6379> msetnx k1 v1 k4 v4 # msetnx 是一个原子性的操作,要么一起成功,要么一起失败! (integer) 0 127.0.0.1:6379> get k4 (nil)
6、对象
# 对象 set user:1 {name:alex,age:21} # 设置一个 user:1 对象,值为json字符来保存一个对象! # 这里的 key 是一个巧妙的设计:user:{id}:{fild},如此设计在Redis中是完全ok的。 127.0.0.1:6379> mset user:1:name Java user:1:age 25 OK 127.0.0.1:6379> mget user:1:name user:1:age 1) "Java" 2) "25"
7、组合命令 getset
# 先get再set 127.0.0.1:6379> getset money "1w" # 如果不存在值,则返回nil,然后设置新值 (nil) 127.0.0.1:6379> get money "1w" 127.0.0.1:6379> getset money "2w" # 如果存在值,则返回,并重新设置值 "1w" 127.0.0.1:6379> get money "2w"