redis

原创
2019/07/24 10:31
阅读数 10

redis编译与安装

1. 解压redis

将redis源代码文件上传到Linux系统之中,随后将其解压到home/jiangbang/redis/src/ 目录中

tar xzvf /home/jiangbang/redis-3.2.5.tar.gz -C /home/jiangbang/redis/src/

2.编译redis

进入到解压好的redis目录中,通过make命令编译redis(redis是C语言编译的)

cd /home/jiangbang/redis/src/redis-3.2.5
make

3.安装Redis

编译正确后,进行redis数据库的安装。出现笑脸证明安装成功

make install

4.建立redis工作目录

虽然此时已经编译完成了reids数据库代码,但还是在原来的目录中,正式工作使用的时候,不推荐直接在src中工作,所以需要创建redis的工作目录

建立工作目录: mkdir -p /home/jiangbang/redis/{bin,etc}

bin 目录保存所有的可执行程序路径  
etc 保存的是redis配置文件信息

建立数据保存目录:mkdir -p /home/jiangbang/redis/{db,run,logs}

db 存放数据的信息  
run 存放pid(进程编号)信息  
logs 存放所有日志

5.将Redis核心程序移入工作目录

将源代码目录(home/jiangbang/redis/src)中redis核心的可执行程序文件拷贝到工作目录

cd /home/jiangbang/redis/src/redis-3.2.5/src/ && cp redis-server redis-cli redis-benchmark /home/jiangbang/redis/bin/

此时在/home/jiangbang/redis/bin目录中会有三个核心的启动文件

redis-server:用于reids服务器启动程序  
redis-cli :进行客户端操作的程序  
redis-benchmark:redis 性能测试

Redis数据操作

1.启动服务器

进入bin工作目录,启动它下面的redis-server。

cd /home/jiangbang/redis/bin/
redis-server

2.启动客户端

由于只在一台虚拟机上安装了redis,所以这台虚拟机既是服务器,又是客户端测试,启动之后,需要另开一共ssh会话连接作为客户端
redis-cli --help 帮助
-h 表示要连接的主机
-p 表示要连接的redis端口,默认端口为6379
-a 表示要连接的密码
案例:redis-cli -h 192.168.150.128 -p 6379 创建ip和端口
由于本次还没有进行更多的网络配置,只能连接到本地,所以只需要设置端口就可以啦

cd /home/jiangbang/redis/bin/
redis-cli -p 6379

3.性能测试

redis有强大的性能测试功能,通过命令redis-benchmark来操作
-c 参与模拟的客户端数量
-d 设置模拟数据大小
-P 定义管道的执行数量
-n 请求的次数
实例:模拟500个用户,每个用户发送2W次的请求,每个数据块1000字节

redis-benchmark -c 500 -d 1000 -n 20000

4.字符串数据操作

设置数据内容:set key value;
取得数据内容:get key
查看所有的集合:keys *
清空数据库:flushdb
选择数据库:select 数据库编号
        |-数据库一共默认有16个,可以选择的就是0~15
设置多个key: mset key1 value1 key2 value2 ...
不覆盖设置(如果已存在key,则不修改):setnx key value
追加内容:append key 追加内容
取得数据长度:strlen key
删除指定数据:del key key key
自增处理:incr key
自减处理:decr key
自增指定数据(key值,每次被调用都增加10):incrby key 10  
自减指定数据(key值,每次被调用都减少10):decrby key 10  
设置数据有效期:setex key time value    
查看数据有效时间(如果数据已过期,返回-2):ttl key   
让有过期时间数据不过期:persist key

5.散列(Hash)类型

存放hash数据:hset 对象key 属性key 内容
取出hash数据:hget 对象key 属性key 
不覆盖设置:hsetnx 对象key 属性key  内容
批量设置:hmset 对象key 属性key1  内容1 属性key2  内容2 ...
获取对象的所有key:hmget 对象key 属性key1 属性key2...
判断某个数据是否存在:hexists 对象key 属性key
取出全部内容:hlen key;
删除指定key信息:hdel 对象key 属性key
取出所有key: hkeys 对象key
取出hash中所有内容:hvals 对象key
获取全部的key和value:hgettall 对象key
数据加法:hincrby 对象key 属性key 数字

6.列表(List)类型

列表是链表结构,最早进,最晚出
取出所有数据(索引从0开始),如果想要输出全部内容,则将结束索引写成-

向栈中存放数据:lpush 集合key 内容
取出指定索引位置的内容:lrange 集合key 头部索引 尾部索引
从尾部保存元素:rpush 集合key 内容
在指定元素前追加内容:linsert 集合key before 内容1 添加内容
修改指定索引的内容:lset 集合key 索引 内容
删除数据:lrem 集合key 内容 索引 删除内容
保留指定key的值范围内的数据:ltrim 集合key 开始索引 结束索引
从指定集合的头部删除元素,并返回删除元素:lpop 集合key
将移除的元素添加到指定的集合中:rpoplpush 集合key 集合key
取出元素指定索引的内容:lindex 集合key 索引
返回集合中元素个数:llen 集合key

7.集合(set)类型

向集合添加元素:sadd 集合key 内容
查询set集:smembers 集合key
删除集合元素:srem 集合key 内容
从集合中随机弹出一个元素:spop 集合key
返回两个集合的差集:sdiff 集合key1 集合key2
将差集保存到另外一个集合之中:sdiffstore 存储集合 集合key1 集合key2
交集计算:sinter 集合key1 集合key2
将交集保存到新的集合之中:sinterstore 存储集合 集合key1 集合key2
并集计算,将两个集合合并到一起:sunion 集合key1 集合key2
将并集进行存储:sunionstore 存储集合 集合key1 集合key2
从第一个可以对应的set中移除并添加到另外一个集合之中:smove 集合key1 集合key2
第一个集合内容
返回名称为key的集合个数:scard 集合key
测试member是否是名称为key的set元素:slsmember 集合key 内容
随机返回名称为key的一个集合元素,但是不删除元素:srandmember 集合key

8.有序集合(Sorted Set)类型

5个人使用了Java:zadd infos 5 java
查看所有内容,不显示分数的查看:zrange infos 0 -1 ,所有数据是按照分数升序
查看所有内容,显示分数的查看:zrange infos 0 -1 withscores

追加有序集合数据:zadd 集合key 分数 内容
取出有序集合内容:zrange 集合key 0 -1 withscores
删除集合数据:zrem 集合key 内容
数据增长(针对于顺序增加):zincrby 集合key 分数 内容
返回集合中指定元素的索引数值:zrank 集合key 内容
反转数据:zrevrank 集合kye 内容
反转后取得数据:zrevrange 集合 开始分数 结束分数 withscores
根据索引取得指定范围的数据:zrangebyscore 集合 开始分数 结束分数 withscores
取出集合中指定分数范围的数据:zcount 集合key 开始分数 结束分数
取出指定集合中元素个数:zcard 集合key
根据下标排序,删除指定范围中的数据:zremrangebyrank 集合key 开始索引 结束索引

Redis进阶操作

1.Redis事务处理

设置一个数据: set age 30
打开事务支持:multi
[QUEUED]进行数据操作:set age 50
提交事务:exec

Redis本身支持事务处理,但是这种支持的事务处理本身存在有设计缺陷。
如果在事务开启状态下进行了更新处理,随后只有执行了exec指令后才表示事务真正提交,才会真正影响到原始数据。

设置一个数据: set id mldn
打开事务支持:multi
[QUEUED]进行数据操作:incr id
[QUEUED]进行数据操作:set age 500
提交事务:exec

这个时候一旦提交事务一定会出现错误信息“ERR value is not an integer or out ...”,但是一旦出现了错误之后,其他的更新操作依旧可以正常完成。
Redis设计之初就是不考虑事务的,所以以上的事务只能够说是Redis的一个玩笑。

2.Redis乐观锁

悲观锁:基于数据库的操作实现

在数据库执行操作的时候,为了保证数据的一致行,即A用户更新sql中加上for update表示数据锁上,其他用户无法更新,只有我断开连接后,才能更新这条数据
==select * from member where id =1 for update==

乐观锁:基于算法实现

image

A更新时,将锁编号从1改为了2,同时修改了数据,B进行操作时,发现它的锁编号1和数据的锁编号2不匹配,无法更新

Redis里面是直接支持乐观锁的,如果要想观察乐观锁的处理,

【第一个Session】执行如下操作:
设置一个数据: set age 30
进行该数据的监听(watch开启乐观锁): watch age
启动事务:multi
【第二个sessoin对数据进行修改操作】
覆盖age数据:set age 500
取得age数据:get age
【第一个session对数据修改】
修改数据:set age 60
提交事务:exec

此时由于第二个Session已经更新了原始数据,那么就表示该原始数据的一个标记列更新,这样当第一个session再进行更新的时候会发现返回了“(nil)”,表示本次更新失败。

3.Redis密码配置

如果说你现在的Redis没有进行认证的处理操作,那么所有的程序都可以进行连接,直接使用redis-Cli命令只需要设置上主机名称和端口号就可以进行连接处理。那么为了安全必须要设置密码。 在redis数据库设计的时候并没有像其他数据库那样准备了一堆复杂的密码或者权限的概念。在redis中只需要设置一个认证密码就可以解决问题。

  1. 修改redis.conf配置文件: Vim /home/jiangbang/redis/conf/redis.conf 追加以下内容:requirepass 123456

  2. 随后关闭掉redis服务并且重新启动: 关闭redis服务: killall redis-server
    重新启动redis服务:/home/jiangbang/redis/bin/redis-server /home/jiangbang/redis/conf/redis.conf

  3. 登陆redis服务器: /user/local/redis/bin/redis-cli –h 127.0.0.1 –p 6379

  4. 这个时候发现可以正常登陆Redis数据库,但是执行数据操作时报错 (error) NOAUTH Authentication required 此时可以执行如下命令进行认证处理: auth 123456
    或者直接在登陆客户端的时候进行认证编号,使用一个”-a”的参数即可: /user/local/redis/bin/redis-cli –h 127.0.0.1 –p 6379 –a 123456
    所有的redis服务一定都要有认证密码,而且作为redis集群开发的时候,一定要将所有密码统一

4.Redis性能监控

使用Java操作Redis数据可以

连接Redis数据库

Jedis数据操作

Jedis连接池

Redis主从配置

主从模式实现

主从模式概述

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部