Redis学习笔记

概念

NOSQL

什么是NOSQL

NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。

优势

  • 成本低:nosql数据库简单意部署,基本是开源软件
  • 查询速度:特别快,数据存在内存中,如果有需要也可以持久化到硬盘
  • 存储数据的格式:nosql的存储格式是key / value形式、文档形式、图片形式等,可以存储基础类型,对象,集合,列表等
  • 扩展性:关系型数据库有join这样的多表查询机制导致扩展困难

缺点

  • 维护的工具和资料有限

常见NOSQL数据库

Redis,MongoDB

Redis

Redis概念

Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s ,且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:
1) 字符串类型 string
2) 哈希类型 hash
3) 列表类型 list
4) 集合类型 set
5) 有序集合类型 sortedset

Redis应用场景

• 缓存(数据查询、短连接、新闻内容、商品内容等等)
• 聊天室的在线好友列表
• 任务队列。(秒杀、抢购、12306等等)
• 应用排行榜
• 网站访问统计
• 数据过期处理(可以精确到毫秒
• 分布式集群架构中的session分离

下载安装

官网:https://redis.io
中文网: http://www.redis.net.cn/
解压直接可以使用:
* redis.windows.conf:配置文件
* redis-cli.exe:redis的客户端
* redis-server.exe:redis服务器端

redis中的数据结构

redis存储的是:key,value格式的数据,其中key都是字符串,value有5种不同的数据结构,value的数据结构:

  • 字符串类型 string
  • 哈希类型 hash : map格式
  • 列表类型 list : linkedlist格式。支持重复元素
  • 集合类型 set : 不允许重复元素
  • 有序集合类型 sortedset:不允许重复元素,且元素有顺序

命令操作

字符串类型 string

命令说明
set key value存储
get key value获取键对应的value的类型

哈希类型 hash

命令说明
hset key field value存储
hget key field获取指定的field对应的值
hgetall key获取所有的field和value
hdel key field删除

列表类型 list

允许重复元素,可以添加一个元素到列表的头部(左边)或者尾部(右边)

命令说明
lpush key value将元素加入列表左边
rpush key value将元素加入列表右边
lrange key start end范围获取
lpop key删除列表最左边的元素,并将元素返回
rpop key删除列表最右边的元素,并将元素返回

举例

  • lrange myList 0 -1,获取myList的所有元素

集合类型 set

不允许重复元素

命令说明
sadd key value存储
smembers myset获取
srem key value删除set集合中的某个元素

有序集合类型 sortedset

不允许重复元素,且元素有顺序.每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

命令说明
zadd key score value存储
zrange key start end [withscores]获取
zrem key value删除

举例

127.0.0.1:6379> zrange mysort 0 -1 withscores
		1) "zhangsan"
		2) "60"
		3) "wangwu"
		4) "80"
		5) "lisi"
		6) "500"

通用命令

命令说明
keys *查询所有的键
type key获取键对应的value的类型
del key删除指定的key value

持久化

redis是一个内存数据库,当redis服务器重启,获取电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。

redis持久化机制

方式一【RDB】:默认方式,不需要进行配置,默认就使用这种机制。在一定的间隔时间中,检测key的变化情况,然后持久化数据。

1. 编辑redis.windwos.conf文件
	#   after 900 sec (15 min) if at least 1 key changed
	save 900 1
	#   after 300 sec (5 min) if at least 10 keys changed
	save 300 10
	#   after 60 sec if at least 10000 keys changed
	save 60 10000
	
2. 重新启动redis服务器,并指定配置文件名称
	D:\redis-2.8.9>redis-server.exe redis.windows.conf	

方式二【AOF】:日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据。

1. 编辑redis.windwos.conf文件
		appendonly no(关闭aof) --> appendonly yes (开启aof)
		
		# appendfsync always : 每一次操作都进行持久化
		appendfsync everysec : 每隔一秒进行一次持久化
		# appendfsync no	 : 不进行持久化

Jedis

一款java操作redis数据库的工具.

使用步骤:

  1. 导包
  2. 操作Jedis

Jedis操作各种数据结构举例

(1)string

    public void test1() {
        //创建连接
        Jedis jedis = new Jedis("localhost", 6379);
        //操作数据
        jedis.set("username", "zhangsan");
        String username = jedis.get("username");
        System.out.println(username);
        //设置一个指定过期时间的key value
        jedis.setex("age", 20, "18");
        //关闭连接
        jedis.close();
    }

(2)hash

    public void test2() {
        //创建连接
        Jedis jedis = new Jedis();
        //操作数据
        //存储数据
        jedis.hset("user", "name", "wangwu");
        jedis.hset("user", "age", "18");
        jedis.hset("user", "address", "guangxi");
        //获取数据
        //获取hashset的map中的数据
        Map<String, String> user = jedis.hgetAll("user");
        //keyset
        Set<String> keySet = user.keySet();
        for (String key : keySet) {
            System.out.println(key);
        }
        //关闭连接
        jedis.close();
    }

(3)list

  public void test3() {
        //创建连接
        Jedis jedis = new Jedis();
        //操作数据
        //存储数据
        jedis.lpush("mylist", "a", "b", "c");
        jedis.rpush("mylist", "a", "b", "c");

        //获取数据
        List<String> mylist = jedis.lrange("mylist", 0, -1);
        System.out.println(mylist);

        //删除数据
        String popEle1 = jedis.lpop("mylist");
        String popEle2 = jedis.rpop("mylist");
        mylist = jedis.lrange("mylist", 0, -1);
        System.out.println(mylist);

        //关闭连接
        jedis.close();
    }

(4)set

    public void test4() {
        //创建连接
        Jedis jedis = new Jedis();
        //操作数据
        //存储数据
        jedis.sadd("myset", "1", "2", "3");
        //获取数据
        Set<String> myset = jedis.smembers("myset");
        System.out.println(myset);
        //关闭连接
        jedis.close();
    }

(5)sortedset

    public void test5() {
        //创建连接
        Jedis jedis = new Jedis();
        //操作数据
        //存储数据
        jedis.zadd("mysortedset", 10, "奇瑞qq");
        jedis.zadd("mysortedset", 100, "劳斯莱斯");
        jedis.zadd("mysortedset", 50, "别克");

        //获取数据
        Set<String> mysortedset = jedis.zrange("mysortedset", 0, -1);
        System.out.println(mysortedset);
        //关闭连接
        jedis.close();
    }

Jedis连接池

(1)jedis.properties

host=127.0.0.1
port=6379
maxTotal=50
maxIdle=10

(2)JedisPoolUtils

/**
 * JedisPool工具类
 */
public class JedisPoolUtils {

    private static JedisPool jedisPool;

    static {
        //加载配置文件
        InputStream in = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
        //创建properties对象
        Properties properties = new Properties();
        //关联文件
        try {
            properties.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //读取属性文件并配置
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(Integer.parseInt(properties.getProperty("maxTotal")));
        config.setMaxIdle(Integer.parseInt(properties.getProperty("maxIdle")));
        //初始化jedis连接池
        jedisPool = new JedisPool(config,properties.getProperty("host"),Integer.parseInt(properties.getProperty("port")));
    }

    /**
     * 获取Jedis连接
     *
     * @return
     */
    public static Jedis getJedis() {
        return jedisPool.getResource();
    }

    /**
     * 关联连接 归还连接到连接池
     */
    public static void close(){
        jedisPool.close();
    }

}

使用

    public void test6() {
        //获取连接
        Jedis jedis = JedisPoolUtils.getJedis();
        //操作
        jedis.set("music","take me higher");
        //获取数据
        String music = jedis.get("music");
        System.out.println(music);
        //关闭连接
        JedisPoolUtils.close();
    }

Redis缓存优化案例:点击跳转

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值