规则引擎RulerZ用法及实现原理解读

包下载地址:https://github.com/K-Phoen/rulerz

composer安装:composer require 'kphoen/rulerz'

使用:

use RulerZ\Compiler\Compiler;
use RulerZ\RulerZ;
use RulerZ\Target\Native\Native;

 public function getRulerZChecker()
    {
        $compiler = Compiler::create();
        $rulerz = new RulerZ($compiler, [
            new Native([
                'length' => 'strlen'
            ],[
                'contains' => function ($a, $b) {
                    return sprintf('strstr(%s, %s)', $a, $b);
                }
            ])
        ]);

        return $rulerz;
    }

我们需要搜索、校验的数据:

1、批量匹配,

 $datas    = [
            ['pseudo' => 'Joe', 'fullname' => 'Joe la frite', 'gender' => 'M', 'points' => 20],
            ['pseudo' => 'Moe', 'fullname' => 'Moe, from the bar!', 'gender' => 'M', 'points' => 200],
            ['pseudo' => 'hazel', 'fullname' => 'hazel, from the hazel!', 'gender' => 'M', 'points' => 100],
            ['pseudo' => 'Alice', 'fullname' => 'Alice, from... you know.', 'gender' => 'F', 'points' => 100],
            ['pseudo' => 'Alice', 'fullname' => 'Alice, from... you know.', 'gender' => 'F', 'points' => 20],
        ];
        $rule       = "gender = :gender and points > :min_points";
        $parameters = [
            'min_points' => 30,
            'gender'     => 'M',
        ];
        $rulerz     = $this->getRulerZChecker();
        $result     = iterator_to_array(
            $rulerz->filter($datas, $rule, $parameters) // the parameters can be omitted if empty
        );

最后的到的结果

array(2) {
  [0]=>
  array(4) {
    ["pseudo"]=>
    string(3) "Moe"
    ["fullname"]=>
    string(18) "Moe, from the bar!"
    ["gender"]=>
    string(1) "M"
    ["points"]=>
    int(200)
  }
  [1]=>
  array(4) {
    ["pseudo"]=>
    string(5) "hazel"
    ["fullname"]=>
    string(22) "hazel, from the hazel!"
    ["gender"]=>
    string(1) "M"
    ["points"]=>
    int(100)
  }
}

2、判断数据是否符合要求:

$rulerz->satisfies($data, $rule, $parameters);
// 返回布尔值,true表示满足

 $data    =['pseudo' => 'Moe', 'fullname' => 'Moe, from the bar!', 'gender' => 'M', 'points' => 200];
        $rule       = "gender = :gender and points > :min_points";
        $parameters = [
            'min_points' => 30,
            'gender'     => 'M',
        ];
        $rulerz     = $this->getRulerZChecker();
        $result     = $rulerz->satisfies($data, $rule, $parameters);//bool(true)

上文中contains表示的是用系统函数strstr()来判断$a中是否包含$b字符,由于编译后的代码是通过字符串生成的,所以你在这个匿名函数中必须要用字符串表达判断逻辑,这也是其缺点之一。

Lock4j是一个基于Redis实现的分布式锁组件,它提供了一种简单的方式来实现分布式系统中的资源同步访问控制。使用Lock4j,开发者可以通过注解或编程方式在Java应用中创建锁,从而保证操作的原子性和一致性。Lock4j支持常见的锁操作,如获取锁、释放锁以及锁的续期(可选)等。 基本使用步骤如下: 1. 引入依赖:在项目的pom.xml文件中添加Lock4j的依赖。 2. 配置Redis连接:通过配置文件或者编程方式配置与Redis服务器的连接参数。 3. 使用注解或编程方式创建锁:可以使用注解的方式在方法上添加`@Lock`注解来自动处理锁的获取和释放;也可以通过编程方式创建`LockTemplate`对象,并调用相应的方法来实现锁的操作。 4. 锁的配置:可以通过配置文件或代码的方式设置锁的超时时间、等待时间等参数。 这里提供一个简单的使用示例: ```java import com.github.rulerz.lock.Lock; import com.github.rulerz.lock.LockTemplate; import com.github.rulerz.lock.annotation.Lock4j; public class MyService { private LockTemplate lockTemplate; public MyService(LockTemplate lockTemplate) { this.lockTemplate = lockTemplate; } @Lock4j(lockName = "myLockName", keepMills = 10000L, tryMills = 500L, retryCount = 3) public void testLock() { // 在这里编写业务逻辑 } } ``` 以上代码中,`@Lock4j`注解定义了锁的名称、锁的持有时间、尝试获取锁的等待时间以及重试次数等参数。在`testLock`方法中,`LockTemplate`负责创建和释放锁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值